Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Übergeben des XML-String-Parameters an die gespeicherte SQL Server-Prozedur

Definieren Sie Ihre gespeicherte Prozedur so, dass sie einen Parameter vom Typ XML akzeptiert (Verwenden Sie nicht ntext nicht mehr! Es ist veraltet). Und verwenden Sie nicht den sp_ Präfix für Ihre gespeicherten Prozeduren - es ist ein reserviertes Präfix für die interne Verwendung durch Microsoft und verursacht Leistungseinbußen - verwenden Sie etwas anderes! (oder überhaupt kein Präfix verwenden)

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

Versuchen Sie dies (mit der nativen XQuery-Methoden in SQL Server 2005 und neuer, anstelle des ziemlich chaotischen OPENXML Schnittstelle....):

;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)

Ich habe keine email gefunden -Attribut in Ihrem XML - nicht sicher, woher Sie das bekommen wollen ....

Aktualisierung: ok, du scheinst also auch <last_updated> zu haben Elemente in Ihrem Real XML ....

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

Dies sieht aus wie ein DATETIMEOFFSET für mich - da es den +05:30 hat Zeitzonenzusatz.

Verwenden Sie in diesem Fall stattdessen diesen Code:

;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)