Xác định thủ tục được lưu trữ của bạn để nhận tham số kiểu XML (không sử dụng ntext
nữa không! Nó không được dùng nữa). Và không sử dụng sp_
tiền tố cho các thủ tục được lưu trữ của bạn - đó là tiền tố dành riêng cho Microsoft sử dụng nội bộ và gây suy giảm hiệu suất - hãy sử dụng thứ khác! (hoặc hoàn toàn không sử dụng bất kỳ tiền tố nào)
ALTER procedure [dbo].InsertCmsUser
@xmlString XML
AS
......
Hãy thử điều này (sử dụng bản địa Các phương thức XQuery trong SQL Server 2005 và mới hơn, thay vì OPENXML
khá lộn xộn giao diện ....):
;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)
Tôi không tìm thấy bất kỳ email
trong XML của bạn - không chắc bạn muốn lấy thuộc tính đó từ đâu ....
Cập nhật: được rồi, vì vậy bạn dường như cũng có <last_updated>
các yếu tố trong thực của bạn XML ....
<last_updated>2012-09-12T22:59:10.813+05:30</last_updated>
Điều này trông giống như một DATETIMEOFFSET
đối với tôi - vì nó có +05:30
bổ sung múi giờ.
Trong trường hợp đó, hãy sử dụng mã này thay thế:
;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)