将xml字符串参数传递给SQL Server存储过程
我将一个xml字符串传递给SQL Server中的存储过程,以便将10000条记录插入到我的表中。在这个时候我调用这个存储过程。想要检查SQL Server表与我正在传递的xml字符串,如果记录存在,我不想插入,如果它是单独记录的新记录必须插入。给出一些解决方案。谢谢。将xml字符串参数传递给SQL Server存储过程
ALTER procedure [dbo].[SP_CMSUSER1]
(@xmlString ntext)
as
begin
DECLARE @idoc INT
DECLARE @data nvarchar(100)
EXEC sp_xml_preparedocument @idoc OUTPUT, @xmlString
INSERT INTO dbo.Seg_RecipientsTemp (ContactID,first_name,last_name,company,email,last_updated)
SELECT ContactID,
first_name,
last_name,
company,
email,
last_updated FROM OPENXML(@idoc,
'/NewDataSet/ContactData', 6)
WITH
(ContactID int ,
first_name nvarchar(50),
last_name nvarchar(50),
company nvarchar(max),
email nvarchar(100),
last_updated datetime
)
end
我的XML是:
<NewDataSet>
<Table>
<ContactID>2</ContactID>
<last_name>klklk</last_name>
</Table>
<Table>
<ContactID>4</ContactID>
<first_name>k</first_name>
<last_name>kk</last_name>
<company>k</company>
</Table>
<Table>
<ContactID>6</ContactID>
<first_name>naveen</first_name>
<last_name />
<company>inno</company>
</Table>
<Table>
<ContactID>7</ContactID>
<first_name>sridar</first_name>
<last_name />
<company>mahindara</company>
</Table>
<Table>
<ContactID>1</ContactID>
<first_name>terst</first_name>
</Table>
<Table>
<ContactID>2</ContactID>
<first_name />
<last_name>ask</last_name>
<company />
</Table>
</NewDataSet>
定义存储过程采取型XML的参数(不使用ntext
了它的过时!)。并且不要为存储过程使用sp_
前缀 - 它是一个保留的前缀,供Microsoft内部使用并导致性能下降 - 使用其他内容! (或不使用任何前缀的话)
ALTER procedure [dbo].InsertCmsUser
@xmlString XML
AS
......
试试这个(使用SQL Server中的本地 XQuery的方法和更新,而不是相当混乱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)
我没有找到您的XML任何email
属性 - 不知道在哪里,你想从....
Updat E:好了,你似乎也有<last_updated>
元素在你的真正 XML ....
<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)
Thanx为您的response.Sorry电子邮件ID那里我didnot添加在xml为测试目的,我得到了一个错误,我得到了另一个问题转换失败时,从字符串转换datedate从字符串为lastupdated字段,在XML我得到下面的标记
@ Kamalakannan.M:在您发布的示例中看到这样一个
XML解析:第76442行,字符53,非法xml字符 – 2013-03-06 07:00:04
这将是有益的**看一个示例XML **,并得到你想要从中提取什么解释! – 2013-02-28 06:37:57
我想检查contactid是否存在于sql表中与xml字符串,如果已经存在我不想插入,新记录只需要插入,我需要如果不存在(select * from dbo.Seg_RecipientsTemp where Contact_Id =(this in我需要使用xml conatacid进行检查) – 2013-02-28 06:41:24
您是否想为'dbo.Seg_RecipientsTemp'中不存在的'ContactID'的记录插入数据,但存在于XML数据中?是否要更新'dbo.Seg_RecipientsTemp '对于'XML数据中确实存在的'ContactID'? – 2013-02-28 06:47:31