sql >> Databasteknik >  >> RDS >> Sqlserver

Skickar xml-strängparameter till SQL Server-lagrad procedur

Definiera din lagrade procedur för att ta en parameter av typen XML (använd inte ntext längre! Den är utfasad). Och använd inte sp_ prefix för dina lagrade procedurer - det är ett reserverat prefix för intern användning av Microsoft och orsakar prestandaförsämring - använd något annat! (eller använd inte något prefix alls)

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

Prova detta (med native). XQuery-metoder i SQL Server 2005 och nyare, istället för det ganska röriga OPENXML gränssnitt....):

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

Jag hittade ingen email attribut i din XML - inte säker på var du vill få det ifrån ....

Uppdatering: ok, så du verkar också ha <last_updated> element i din riktiga XML ....

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

Detta ser ut som en DATETIMEOFFSET för mig - eftersom den har +05:30 tillägg av tidszon.

Använd i så fall den här koden istället:

;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. Utforska SQL Server 2014 SELECT INTO Parallelism

  2. Undersökningar med EXISTS vs IN - MySQL

  3. Närmaste match, del 3

  4. Sparse Columns i SQL Server:Inverkan på tid och rum