用于sql update的openxml where子句

Nis*_*ant 2 t-sql sql-server flags filter

这是我的xml

<root>
<children>
 <child id = "1">
  <description>This is child 1</description>
 </child>
 <child id = "2">
    <description>This is child 2</description>
 </child>
 <child id = "3">
    <description>This is child 3</description>
 </child>
</children>
</root>
Run Code Online (Sandbox Code Playgroud)

我正在尝试更新名为Child的表,其中包含"ID"和"Description"列.该表中已包含ID列值,但描述为空.我需要根据上面给出的xml文件中的ID更新此描述.

我尝试使用标志值为2(以元素为中心)执行OPENXML,并且能够检索所有描述.但我不知道如何使用OPENXML中的where子句基于ID值检索描述.

我使用的数据库是SQL Server 2008.
(OPENXML也适用于SQL Server 2005吗?)

这是我试图做的wat:

DECLARE @idoc int DECLARE @doc xml

select @doc= c from openrowset(bulk 'C:\Test.xml',single_blob) as temp(c)
exec sp_xml_preparedocument @idoc output, @doc 

SELECT * FROM OPENXML (@idoc, '/root/children/child', 2)
  WITH (summary  varchar(1000)) descr 
EXEC sp_xml_removedocument @idoc
Run Code Online (Sandbox Code Playgroud)

在此先感谢尼克

ps:无法更改xml的结构.我需要解决这个问题.

mar*_*c_s 7

假设您使用的是SQL Server 2005或者您正在将XML存储在一个名为的变量中@input,您可以尝试这样做:

declare @input XML 

set @input = '<root>
<children>
 <child id="1">
  <description>This is child 1</description>
 </child>
 <child id="2">
    <description>This is child 2</description>
 </child>
 <child id="3">
    <description>This is child 3</description>
 </child>
</children>
</root>'

;with GrabXML AS
(
    select
        child.value('@id', 'int') as 'ID',
        child.value('(description)[1]', 'varchar(50)') as 'Description'
    from
        @input.nodes('/root/children/child') as n(Child)
)
update dbo.Child
set description = g.Description
from GrabXML g
where dbo.Child.ID = g.ID
Run Code Online (Sandbox Code Playgroud)

GrabXML公用表表达式(CTE)解析并展平了XML为行和列,和下面的UPDATE语句使用那些行/列来更新现有的表.

更新:如果您的字符串超出预期,则有两个可能的问题点:

首先,您可能需要增加从XML转换的长度:

select
   child.value('@id', 'int') as 'ID',
   child.value('(description)[1]', 'varchar(999)') as 'Description'
Run Code Online (Sandbox Code Playgroud)

其次,您需要检查表中列dbo.Child的长度,并截断从XML中提取的字符串的长度,使其不超过数据库列的长度:

update dbo.Child
set description = SUBSTRING(g.Description, 1, 575)
Run Code Online (Sandbox Code Playgroud)

在这里,您需要从数据库列允许的字符串中提取最多的字符数.g.Descriptiondbo.Child.description