Defina seu procedimento armazenado para obter um parâmetro do tipo XML (não use
ntext
não mais! Está obsoleto). E não use o sp_
prefixo para seus procedimentos armazenados - é um prefixo reservado para uso interno pela Microsoft e causa degradação de desempenho - use outra coisa! (ou não use nenhum prefixo) ALTER procedure [dbo].InsertCmsUser
@xmlString XML
AS
......
Tente isto (usando o nativo Métodos XQuery no SQL Server 2005 e mais recente, em vez do confuso
OPENXML
interface....):;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)
Não encontrei nenhum
email
atributo em seu XML - não tenho certeza de onde você deseja obter isso .... Atualização: ok, parece que você também tem
<last_updated>
elementos em seu real XML.... <last_updated>2012-09-12T22:59:10.813+05:30</last_updated>
Parece um
DATETIMEOFFSET
para mim - já que tem o +05:30
adição de fuso horário. Nesse caso, use este código em vez disso:
;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)