Sql server 使用XML更新表行(SQL Server)

Sql server 使用XML更新表行(SQL Server),sql-server,xml,database,Sql Server,Xml,Database,下面我有一个使用 SELECT * FROM case WHERE ticketNo=@ticketNo FOR XML RAW, ELEMENTS XML如下所示: <row> <ticketNo>1</ticketNo> <caller>name</caller> <category>3</category> <service>4</service> <wo

下面我有一个使用

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>
是否可以在不指定单个列的情况下更新表?

在不指定列的情况下无法执行更新,并且在不指定从哪些节点获取数据的情况下无法从XML获取数据

如果可以使用SQLServer2005中引入的“新”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)')
declare@XML=
'
1.
名称
3.
4.
5.
'
更新[案例]集
[caller]=@XML.value('(/row/caller)[1]','varchar(50)',
category=@XML.value('(/row/category)[1]','varchar(50)'
哪里
ticketNo=@XML.value('(/row/ticketNo)[1],'varchar(50)'

我可以用它来更新表中的一行。它要求您在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:


9999
资料
资料
资料

但即便如此-需要指定各个列-真的没有办法解决这个问题…好的,还有其他替代方法吗?@KS Kian Seng-我不知道。
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
<data>
<ID>9999</ID>
<Column1>Data</Column1>
<Column2>Data</Column2>
<Column3>Data</Column3>
</data>