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的结构.我需要解决这个问题.
假设您使用的是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