Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Przekazywanie parametru ciągu xml do procedury składowanej SQL Server

Zdefiniuj procedurę składowaną, aby pobrać parametr typu XML (nie używaj ntext nie więcej! Jest przestarzały). I nie używaj sp_ prefiks dla twoich procedur składowanych — jest to prefiks zarezerwowany do użytku wewnętrznego przez firmę Microsoft i powoduje spadek wydajności — użyj czegoś innego! (lub w ogóle nie używaj żadnego prefiksu)

 ALTER procedure [dbo].InsertCmsUser
      @xmlString XML
 AS
     ......

Spróbuj tego (używając natywnego Metody XQuery w SQL Server 2005 i nowsze, zamiast dość niechlujnego OPENXML interfejs...):

;WITH CTE AS
(
    SELECT
        ContactID = XTbl.value('(ContactID)[1]', 'int'),
        FirstName = XTbl.value('(first_name)[1]', 'varchar(50)'),
        LastName = XTbl.value('(last_name)[1]', 'varchar(50)'),
        Company = XTbl.value('(company)[1]', 'varchar(50)')
    FROM 
        @input.nodes('/NewDataSet/Table') AS XD(XTbl)
)
INSERT INTO 
    dbo.Seg_RecipientsTemp (ContactID, first_name, last_name, company, last_updated)
    SELECT 
        ContactID,
        FirstName,
        LastName,
        Company,
        GETDATE()
    FROM
        CTE
    WHERE
        NOT EXISTS (SELECT * FROM dbo.Seg_RecipientsTemp WHERE ContactID = CTE.ContactID)

Nie znalazłem żadnego email atrybut w Twoim XML - nie wiesz, skąd chcesz to uzyskać ....

Aktualizacja: ok, więc wydaje się, że masz również <last_updated> elementy w Twoim prawdziwym XML ....

<last_updated>2012-09-12T22:59:10.813+05:30</last_updated>

To wygląda jak DATETIMEOFFSET dla mnie - ponieważ ma +05:30 dodanie strefy czasowej.

W takim przypadku użyj tego kodu:

;WITH CTE AS
(
    SELECT
        ContactID = XTbl.value('(ContactID)[1]', 'int'),
        FirstName = XTbl.value('(first_name)[1]', 'varchar(50)'),
        LastName = XTbl.value('(last_name)[1]', 'varchar(50)'),
        Company = XTbl.value('(company)[1]', 'varchar(50)'),
            LastUpdated = XTbl.value('(last_updated)[1]', 'datetimeoffset')
    FROM 
        @input.nodes('/NewDataSet/Table') AS XD(XTbl)
)
INSERT INTO 
    dbo.Seg_RecipientsTemp (ContactID, first_name, last_name, company, last_updated)
    SELECT 
        ContactID,
        FirstName,
        LastName,
        Company,
        LastUpdated
    FROM
        CTE
    WHERE
        NOT EXISTS (SELECT * FROM dbo.Seg_RecipientsTemp WHERE ContactID = CTE.ContactID)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Czy MAMP powinien zwrócić ::1 jako IP na hoście lokalnym?

  2. Schemat serwera SQL i domyślny schemat

  3. Ograniczenie tylko dla jednego rekordu oznaczonego jako domyślne

  4. Jak mogę się dowiedzieć, czy zgłoszono wyjątek SQL z powodu naruszenia klucza obcego?

  5. Konwertuj „datetimeoffset” na „date” w SQL Server (przykłady T-SQL)