Definieer uw opgeslagen procedure om een parameter van het type XML te nemen (gebruik geen ntext
meer! Het is afgekeurd). En gebruik niet de sp_
voorvoegsel voor uw opgeslagen procedures - het is een gereserveerd voorvoegsel voor intern gebruik door Microsoft en veroorzaakt prestatievermindering - gebruik iets anders! (of gebruik helemaal geen voorvoegsel)
ALTER procedure [dbo].InsertCmsUser
@xmlString XML
AS
......
Probeer dit (met behulp van de native XQuery-methoden in SQL Server 2005 en nieuwer, in plaats van het nogal rommelige 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)
Ik heb geen email
gevonden attribuut in uw XML - niet zeker waar u dat vandaan wilt halen ....
Bijwerken: ok, dus je lijkt ook <last_updated>
. te hebben elementen in je echte XML ....
<last_updated>2012-09-12T22:59:10.813+05:30</last_updated>
Dit ziet eruit als een DATETIMEOFFSET
voor mij - aangezien het de +05:30
. heeft tijdzone toevoeging.
Gebruik in dat geval deze 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)