Definiera din lagrade procedur för att ta en parameter av typen XML (använd inte ntext
längre! Den är utfasad). Och använd inte sp_
prefix för dina lagrade procedurer - det är ett reserverat prefix för intern användning av Microsoft och orsakar prestandaförsämring - använd något annat! (eller använd inte något prefix alls)
ALTER procedure [dbo].InsertCmsUser
@xmlString XML
AS
......
Prova detta (med native). XQuery-metoder i SQL Server 2005 och nyare, istället för det ganska röriga OPENXML
gränssnitt....):
;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)
Jag hittade ingen email
attribut i din XML - inte säker på var du vill få det ifrån ....
Uppdatering: ok, så du verkar också ha <last_updated>
element i din riktiga XML ....
<last_updated>2012-09-12T22:59:10.813+05:30</last_updated>
Detta ser ut som en DATETIMEOFFSET
för mig - eftersom den har +05:30
tillägg av tidszon.
Använd i så fall den här koden istället:
;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)