Tentukan prosedur tersimpan Anda untuk mengambil parameter tipe XML (jangan gunakan ntext
lagi! Itu sudah usang). Dan jangan gunakan sp_
awalan untuk prosedur tersimpan Anda - ini adalah awalan yang dicadangkan untuk penggunaan internal oleh Microsoft dan menyebabkan penurunan kinerja - gunakan yang lain! (atau tidak menggunakan awalan sama sekali)
ALTER procedure [dbo].InsertCmsUser
@xmlString XML
AS
......
Coba ini (menggunakan asli Metode XQuery di SQL Server 2005 dan yang lebih baru, sebagai ganti OPENXML
yang agak berantakan antarmuka....):
;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)
Saya tidak menemukan email
atribut dalam XML Anda - tidak yakin dari mana Anda ingin mendapatkannya ....
Pembaruan: ok, jadi sepertinya Anda juga memiliki <last_updated>
elemen di nyata . Anda XML ....
<last_updated>2012-09-12T22:59:10.813+05:30</last_updated>
Ini terlihat seperti DATETIMEOFFSET
untuk saya - karena memiliki +05:30
penambahan zona waktu.
Dalam hal ini, gunakan kode ini sebagai gantinya:
;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)