Defina su procedimiento almacenado para tomar un parámetro de tipo XML (no use ntext
¡ya no! está en desuso). Y no uses el sp_
prefijo para sus procedimientos almacenados:es un prefijo reservado para uso interno de Microsoft y provoca una degradación del rendimiento. ¡Use algo más! (o no use ningún prefijo)
ALTER procedure [dbo].InsertCmsUser
@xmlString XML
AS
......
Pruebe esto (usando el nativo Métodos XQuery en SQL Server 2005 y más nuevos, en lugar del desordenado OPENXML
interfaz...):
;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)
No encontré ningún email
atributo en su XML - no estoy seguro de dónde quiere obtenerlo...
Actualización: ok, parece que también tienes <last_updated>
elementos en su real XML ....
<last_updated>2012-09-12T22:59:10.813+05:30</last_updated>
Esto parece un DATETIMEOFFSET
para mí, ya que tiene el +05:30
adición de zona horaria.
En ese caso, utilice este código en su lugar:
;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)