XML . प्रकार का पैरामीटर लेने के लिए अपनी संग्रहीत कार्यविधि को परिभाषित करें (ntext
का प्रयोग न करें इसके बाद! यह बहिष्कृत है)। और sp_
. का उपयोग न करें आपकी संग्रहीत प्रक्रियाओं के लिए उपसर्ग - यह Microsoft द्वारा आंतरिक उपयोग के लिए एक आरक्षित उपसर्ग है और प्रदर्शन में गिरावट का कारण बनता है - कुछ और उपयोग करें! (या किसी भी उपसर्ग का प्रयोग बिल्कुल न करें)
ALTER procedure [dbo].InsertCmsUser
@xmlString XML
AS
......
इसे आज़माएं (मूल . का उपयोग करके SQL सर्वर में XQuery विधियाँ 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
नहीं मिला आपके एक्सएमएल में विशेषता - सुनिश्चित नहीं है कि आप इसे कहां से प्राप्त करना चाहते हैं ....
अपडेट करें: ठीक है, तो ऐसा लगता है कि आपके पास <last_updated>
. भी है आपके वास्तविक . में तत्व एक्सएमएल ....
<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)