我有一个包含许多节点的大型XML注释.
有没有一种方法可以从较大的XML中只选择一个节点及其所有内容?
我正在使用sql 2005
表名为 MasterTable
列
ID类型BIGINT,
Nametype VARCHAR(200)(xml由于某些原因存储类型数据)
Name 包含结构化的数据
<en-US>SomeEnglishText</en-US><it-IT>SomeItalicText</it-IT>
当我需要Update的Master表,然后在那个时候我需要转换Varchar到xml那么有条件更新/更换的value即或者特定标签的一部分en-US / it-IT.
还有一些机会,没有任何数据/标签有没有在Name列,所以我想在插入数据会的时间Insert清空表像标签元素<en-US></en-US><it-IT></it-IT>,所以update查询必须处理空值,即在标签元素en-US/it-IT.
我想像下面的更新查询一样.
DECLARE @Str VARCHAR(200)
SET @Str = 'Test Text'
UPDATE [MasterTable]
SET [Name] = cast([MasterTable].[Name] as xml).modify('replace value of (en-US/text())[1] with sql:variable("@Str")')
WHERE [ID]=18
Run Code Online (Sandbox Code Playgroud)
运行查询时出现以下错误
非法使用xml数据类型方法'修改'.在此上下文中期望非变异方法.
假设我将员工数据存储xml在我的日志表的列中.有时,数据也会在xml存储过程的列中更新.
这是示例示例
DECLARE @XML1 XML
DECLARE @XML2 XML
SET @XML1 =
'<NewDataSet>
<Employee>
<EmpID>1005</EmpID>
<Name> keith </Name>
<DOB>12/02/1981</DOB>
<DeptID>ACC001</DeptID>
<Salary>10,500</Salary>
</Employee>
</NewDataSet>'
SET @XML2 =
'<NewDataSet>
<Employee>
<EmpID>1006</EmpID>
<Name> keith </Name>
<DOB>05/02/1981</DOB>
<DeptID>ACC002</DeptID>
<Salary>10,900</Salary>
</Employee>
</NewDataSet>'
Run Code Online (Sandbox Code Playgroud)
xml我需要显示的两个数据有一些区别,比如旧值和新值作为sql的输出
Old Value New Value
--------- ---------
1005 1006
12/02/1981 05/02/1981
ACC001 ACC002
10,500 10,900
Run Code Online (Sandbox Code Playgroud)
我只需要像上面那样展示差异.因此,请指导我如何使用XQuery比较两个xml数据,并仅在SQL Server中以上述方式显示差异.请引导我使用代码段.谢谢
我想对SQL Server 2008中的XML列中的所有行执行更新,仅替换某个xml节点中的子字符串.我是XML DML/XQuery的新手,所有这一切,我只是无法弄清楚如何做到这一点.
我要更新的列中的XML示例:
<d>
<p n="Richedit01" t="System.String">
<v>
<p> <img border="0" alt="Football4" src="/$-1/football4.jpg" /> </p>
</v>
</p>
</d>
Run Code Online (Sandbox Code Playgroud)
我想在所有行中替换子串'src ="/ $ - 1 /'与'src ="/ $ - 1/file /'的所有出现.
试过这个,但显然我没办法像这样使用XPath替换函数:
UPDATE Translation
SET ContentData.modify('replace value of (d/p[@t=''System.String'']/v)[1] with (d/p[@t=''System.String'']/v[replace(.,''src="/$-1/'',''src="/$-1/file/'')]) ')
Run Code Online (Sandbox Code Playgroud) 我一直在努力处理这段简单的代码而没有结果.我只是想在XML变量中添加一个新节点.
DECLARE @XML XML;
SET @XML = '<root>
<policyData>
<txtComentario />
<idRegProducto>76</idRegProducto>
<txtDuracion>24</txtDuracion>
</policyData>
</root>';
DECLARE @NODE XML;
SET @NODE = '<newNode>10</newNode>';
SET @XML.modify
('insert sql:variable("@NODE") as first
into (/root/policyData)[0]')
SELECT @XML;
Run Code Online (Sandbox Code Playgroud)
没有错误,但新节点未显示在输出中.在SQL Server中使用XML之前,我必须首先设置一些东西吗?有什么建议为什么这不起作用?
提前致谢!
SQL Server 2008 sp2
我是初学者,发现XQuery语法特别是XPath非常具有挑战性.例如,尝试使用各种xml方法,如exists(),nodes(),value()等....
是否有一个很好的在线教程或您推荐的书籍?
我正在使用SQL Server(2008/2012),我知道很多搜索都有类似的答案,但我似乎无法为我的案例找到合适的示例/指针.
我在SQL Server表中有一个XML列来保存这些数据:
<Items>
<Item>
<FormItem>
<Text>FirstName</Text>
<Value>My First Name</Value>
</FormItem>
<FormItem>
<Text>LastName</Text>
<Value>My Last Name</Value>
</FormItem>
<FormItem>
<Text>Age</Text>
<Value>39</Value>
</FormItem>
</Item>
<Item>
<FormItem>
<Text>FirstName</Text>
<Value>My First Name 2</Value>
</FormItem>
<FormItem>
<Text>LastName</Text>
<Value>My Last Name 2</Value>
</FormItem>
<FormItem>
<Text>Age</Text>
<Value>40</Value>
</FormItem>
</Item>
</Items>
Run Code Online (Sandbox Code Playgroud)
因此,即使结构<FormItem>相同,我也可以拥有多个(通常不超过20-30个)表单项.
我本质上是尝试以下面的格式从SQL返回一个查询,即基于/ FormItem/Text的动态列:
FirstName LastName Age ---> More columns as new `<FormItem>` are returned
My First Name My Last Name 39 Whatever value etc..
My First Name 2 My Last Name 2 40
Run Code Online (Sandbox Code Playgroud)
所以,目前我有以下内容: …
我正在使用SQL Server 2008的xml数据类型进行一些粗略的基准测试.我已经看到很多地方.exist用在where子句中.我最近比较了两个查询,结果很奇怪.
select count(testxmlrid) from testxml
where Attributes.exist('(form/fields/field)[@id="1"]')=1
Run Code Online (Sandbox Code Playgroud)
此查询运行大约需要1.5秒,除了主键(testxmlrid)之外没有任何索引
select count(testxmlrid) from testxml
where Attributes.value('(/form/fields/field/@id)[1]','integer')=1
Run Code Online (Sandbox Code Playgroud)
另一方面,此查询需要大约0.75秒才能运行.
我正在使用非类型化的XML,我的基准测试是在SQL Server 2008 Express实例上进行的.数据集中大约有15,000行,每个XML字符串长约25行.
这些结果我是否正确?如果是这样,为什么每个人都使用.exist?我做错了什么,.exist可能会更快?
下面的查询试图选择给定节点的子节点.如何使用变量而不是硬编码子节点,以便我可以将它们作为SProc中的参数传递?
declare @T table(XMLCol xml)
insert into @T values
('<Root xmlns="http://tempuri.org" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Elem1 type="T1">
<Name type="string" display="First name">John</Name>
<TimeZone display="Time zone">
<children>
<DisplayName type="string" display="Display name">GMT Standard Time</DisplayName>
<HiddenName type="string" display="Hidden name">GMT</HiddenName>
</children>
</TimeZone>
</Elem1>
</Root>')
declare @Node varchar(50)
set @Node = 'TimeZone'
select N.value('(children/DisplayName)[1]', 'varchar(100)') as Value
from @T as T
cross apply T.XMLCol.nodes('//*[local-name()=sql:variable("@Node")]') as X(N)
Run Code Online (Sandbox Code Playgroud) 我想使用Xquery从XML获取属性值.
我的XML是
<Answers>
<AnswerSet>
<Answer questionId="NodeID">155</Answer>
<Answer questionId="ParentNode" selectedValue="12">Product</Answer>
</AnswerSet>
</Answers>
Run Code Online (Sandbox Code Playgroud)
以下是我的查询.
DECLARE @Field Varchar(100)
DECLARE @Attribute VARCHAR(100)
SET @Field='ParentNode'
SET @Attribute = 'selectedValue'
SELECT ISNULL(PropertyXML.value('(/Answers/AnswerSet/Answer[@questionId=sql:variable("@Field")])[1]','varchar(max)'),'') ,
Run Code Online (Sandbox Code Playgroud)
ISNULL(PropertyXML.value('(/ Answers/AnswerSet/Answer [@ questionId = sql:variable("@ Field")]/sql:variable(@Attribute))[1]','varchar(max)'), '')FROM节点WHERE id = 155
下面的行与sql:variable一起工作正常
ISNULL(PropertyXML.value('(/Answers/AnswerSet/Answer[@questionId=sql:variable("@Field")])[1]','varchar(max)'),'')
Run Code Online (Sandbox Code Playgroud)
但我在下面的行中得到错误..
ISNULL(PropertyXML.value('(/Answers/AnswerSet/Answer[@questionId=sql:variable("@Field")]/sql:variable(@Attribute) )[1]','varchar(max)'),'')
Run Code Online (Sandbox Code Playgroud)
我想在结果中获得提供的属性(@Attribute)值.
xquery-sql ×10
sql-server ×9
t-sql ×4
sql ×2
xml ×2
performance ×1
pivot ×1
sql-update ×1
xpath ×1
xquery ×1