Дефинирайте вашата съхранена процедура, за да приемете параметър от тип XML (не използвайте ntext
вече! Той е отхвърлен). И не използвайте sp_
префикс за вашите съхранени процедури - това е запазен префикс за вътрешна употреба от Microsoft и причинява влошаване на производителността - използвайте нещо друго! (или изобщо не използвайте никакъв префикс)
ALTER procedure [dbo].InsertCmsUser
@xmlString XML
AS
......
Опитайте това (използвайки родния Методи XQuery в SQL Server 2005 и по-нови, вместо доста разхвърляния OPENXML
интерфейс....):
;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)
Не намерих никакъв email
атрибут във вашия XML - не сте сигурни откъде искате да го получите ....
Актуализация: добре, така че изглежда също имате <last_updated>
елементи във вашатаистинската XML ....
<last_updated>2012-09-12T22:59:10.813+05:30</last_updated>
Това изглежда като DATETIMEOFFSET
за мен - тъй като има +05:30
добавяне на часови зони.
В този случай вместо това използвайте този код:
;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)