sql >> Base de Datos >  >> RDS >> Sqlserver

Pasar el parámetro de cadena xml al procedimiento almacenado de SQL Server

Defina su procedimiento almacenado para tomar un parámetro de tipo XML (no use ntext ¡ya no! está en desuso). Y no uses el sp_ prefijo para sus procedimientos almacenados:es un prefijo reservado para uso interno de Microsoft y provoca una degradación del rendimiento. ¡Use algo más! (o no use ningún prefijo)

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

Pruebe esto (usando el nativo Métodos XQuery en SQL Server 2005 y más nuevos, en lugar del desordenado OPENXML interfaz...):

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

No encontré ningún email atributo en su XML - no estoy seguro de dónde quiere obtenerlo...

Actualización: ok, parece que también tienes <last_updated> elementos en su real XML ....

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

Esto parece un DATETIMEOFFSET para mí, ya que tiene el +05:30 adición de zona horaria.

En ese caso, utilice este código en su lugar:

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