Definisci la tua procedura memorizzata per prendere un parametro di tipo XML (non usare ntext
più! È deprecato). E non usare sp_
prefisso per le tue stored procedure:è un prefisso riservato per uso interno da parte di Microsoft e causa un degrado delle prestazioni:usa qualcos'altro! (o non utilizzare alcun prefisso)
ALTER procedure [dbo].InsertCmsUser
@xmlString XML
AS
......
Prova questo (usando il nativo Metodi XQuery in SQL Server 2005 e più recenti, invece del piuttosto disordinato OPENXML
interfaccia....):
;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)
Non ho trovato nessun email
attributo nel tuo XML - non sono sicuro da dove vuoi ottenerlo da ....
Aggiornamento: ok, quindi sembra che tu abbia anche <last_updated>
elementi nel tuo reale XML ....
<last_updated>2012-09-12T22:59:10.813+05:30</last_updated>
Sembra un DATETIMEOFFSET
per me - poiché ha il +05:30
aggiunta di fuso orario.
In tal caso, usa invece questo codice:
;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)