Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Passando o parâmetro de string xml para o procedimento armazenado do SQL Server


Defina seu procedimento armazenado para obter um parâmetro do tipo XML (não use ntext não mais! Está obsoleto). E não use o sp_ prefixo para seus procedimentos armazenados - é um prefixo reservado para uso interno pela Microsoft e causa degradação de desempenho - use outra coisa! (ou não use nenhum prefixo)
 ALTER procedure [dbo].InsertCmsUser
      @xmlString XML
 AS
     ......

Tente isto (usando o nativo Métodos XQuery no SQL Server 2005 e mais recente, em vez do confuso OPENXML interface....):
;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)

Não encontrei nenhum email atributo em seu XML - não tenho certeza de onde você deseja obter isso ....

Atualização: ok, parece que você também tem <last_updated> elementos em seu real XML....
<last_updated>2012-09-12T22:59:10.813+05:30</last_updated>

Parece um DATETIMEOFFSET para mim - já que tem o +05:30 adição de fuso horário.

Nesse caso, use este código em vez disso:
;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)