Define your stored procedure to accept an XML type parameter (no longer use ntext !), Which is deprecated). And do not use the sp_ prefix for your stored procedures - this is a reserved prefix for internal Microsoft use and causes performance degradation - use something else! (or not use any prefix at all)
ALTER procedure [dbo].InsertCmsUser @xmlString XML AS ......
Try this (using the native XQuery method in SQL Server 2005 and newer, instead of the rather dirty 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)
I did not find the email attribute in your XML - not sure where you want to get this from ....
Update: ok, so you also have <last_updated> elements in real XML ....
<last_updated>2012-09-12T22:59:10.813+05:30</last_updated>
For me, it looks like DATETIMEOFFSET , since it has the addition of a time zone of +05:30 .
In this case, use this code instead:
;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)