Definieren Sie Ihre gespeicherte Prozedur so, dass sie einen Parameter vom Typ XML akzeptiert (Verwenden Sie nicht ntext
nicht mehr! Es ist veraltet). Und verwenden Sie nicht den sp_
Präfix für Ihre gespeicherten Prozeduren - es ist ein reserviertes Präfix für die interne Verwendung durch Microsoft und verursacht Leistungseinbußen - verwenden Sie etwas anderes! (oder überhaupt kein Präfix verwenden)
ALTER procedure [dbo].InsertCmsUser
@xmlString XML
AS
......
Versuchen Sie dies (mit der nativen XQuery-Methoden in SQL Server 2005 und neuer, anstelle des ziemlich chaotischen OPENXML
Schnittstelle....):
;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)
Ich habe keine email
gefunden -Attribut in Ihrem XML - nicht sicher, woher Sie das bekommen wollen ....
Aktualisierung: ok, du scheinst also auch <last_updated>
zu haben Elemente in Ihrem Real XML ....
<last_updated>2012-09-12T22:59:10.813+05:30</last_updated>
Dies sieht aus wie ein DATETIMEOFFSET
für mich - da es den +05:30
hat Zeitzonenzusatz.
Verwenden Sie in diesem Fall stattdessen diesen 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)