我在下面使用
生成了一个xml文件SELECT * FROM case WHERE ticketNo=@ticketNo FOR XML RAW,
ELEMENTS
XML看起来像这样:
<row>
<ticketNo>1</ticketNo>
<caller>name</caller>
<category>3</category>
<service>4</service>
<workgroup>5</workgroup>
</row>
我使用此查询更新我的表,并使用相同的值更改
UPDATE case
set caller = xmldoc.caller
set category = xml.category
from OpenXml(@idoc, '/row')
with (ticketNo VARCHAR(50)'./ticketNo',
caller VARCHAR(50) './caller',
category VARCHAR(50) './category') xmldoc
where dbo.tb_itsc_case.ticketNo = xmldoc.ticketNo
是否可以更新表而不指定单个列?
答案 0 :(得分:2)
如果没有指定列,则无法执行update,如果没有指定从哪个节点获取数据,则无法从XML获取数据。
如果您可以使用SQL Server 2005中引入的“新”XML数据类型,则可以这样做。
declare @XML xml =
'<row>
<ticketNo>1</ticketNo>
<caller>name</caller>
<category>3</category>
<service>4</service>
<workgroup>5</workgroup>
</row>'
update [case] set
[caller] = @XML.value('(/row/caller)[1]', 'varchar(50)'),
category = @XML.value('(/row/category)[1]', 'varchar(50)')
where
ticketNo = @XML.value('(/row/ticketNo)[1]', 'varchar(50)')
答案 1 :(得分:1)
我能够用它来更新表格中的1行。它要求您在XML中指定所有字段。它将现有行替换为XML中指定的行。
我希望我能弄清楚如何只为XML中的列做这件事。我处理表中字段经常更改的项目,并且需要重新指定列出列名的所有过程。
create procedure Update_TableName (@xml xml) as
DECLARE @handle INT
EXEC sp_xml_preparedocument @handle OUTPUT, @xml
DECLARE @ID varchar(255)
SELECT @ID = ID FROM OPENXML (@handle, '/data', 2) WITH TableName
if exists (select 1 from TableName where ID = @ID)
delete from TableName where ID = @ID
Insert into TableName
SELECT * FROM OPENXML (@handle, '/data', 2) WITH TableName
EXEC sp_xml_removedocument @handle
XML:
<data>
<ID>9999</ID>
<Column1>Data</Column1>
<Column2>Data</Column2>
<Column3>Data</Column3>
</data>