Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Passaggio del parametro stringa XML alla stored procedure di SQL Server

Definisci la tua procedura memorizzata per prendere un parametro di tipo XML (non usare ntext più! È deprecato). E non usare sp_ prefisso per le tue stored procedure:è un prefisso riservato per uso interno da parte di Microsoft e causa un degrado delle prestazioni:usa qualcos'altro! (o non utilizzare alcun prefisso)

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

Prova questo (usando il nativo Metodi XQuery in SQL Server 2005 e più recenti, invece del piuttosto disordinato OPENXML interfaccia....):

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

Non ho trovato nessun email attributo nel tuo XML - non sono sicuro da dove vuoi ottenerlo da ....

Aggiornamento: ok, quindi sembra che tu abbia anche <last_updated> elementi nel tuo reale XML ....

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

Sembra un DATETIMEOFFSET per me - poiché ha il +05:30 aggiunta di fuso orario.

In tal caso, usa invece questo codice:

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