使用XML更新表行(SQL Server)

时间:2011-08-17 11:43:16

标签: sql-server xml database

我在下面使用

生成了一个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

是否可以更新表而不指定单个列?

2 个答案:

答案 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>