Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Passage du paramètre de chaîne xml à la procédure stockée SQL Server

Définissez votre procédure stockée pour prendre un paramètre de type XML (ne pas utiliser ntext plus! C'est obsolète). Et n'utilisez pas le sp_ préfixe pour vos procédures stockées - c'est un préfixe réservé à un usage interne par Microsoft et qui provoque une dégradation des performances - utilisez autre chose ! (ou n'utilisez aucun préfixe)

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

Essayez ceci (en utilisant le natif Méthodes XQuery dans SQL Server 2005 et plus récent, au lieu du plutôt désordonné 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)

Je n'ai trouvé aucun email attribut dans votre XML - vous ne savez pas d'où vous voulez l'obtenir ....

Mise à jour : ok, donc vous semblez également avoir <last_updated> éléments dans votre réel XML....

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

Cela ressemble à un DATETIMEOFFSET pour moi - puisqu'il a le +05:30 ajout de fuseau horaire.

Dans ce cas, utilisez plutôt ce 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)