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)