标签: xquery-sql

使用SQL选择单个xml节点

我有一个包含许多节点的大型XML注释.

有没有一种方法可以从较大的XML中只选择一个节点及其所有内容?

我正在使用sql 2005

sql-server sql-server-2005 xquery-sql

13
推荐指数
1
解决办法
4万
查看次数

Sql Xquery如何替换更新查询中的文本

表名为 MasterTable

ID类型BIGINT,

Nametype VARCHAR(200)(xml由于某些原因存储类型数据)

Name 包含结构化的数据

<en-US>SomeEnglishText</en-US><it-IT>SomeItalicText</it-IT>

当我需要UpdateMaster表,然后在那个时候我需要转换Varcharxml那么有条件更新/更换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数据类型方法'修改'.在此上下文中期望非变异方法.

sql-server xquery-sql xquery-update sql-update

10
推荐指数
1
解决办法
1万
查看次数

在SQL Server中使用XQuery比较两组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中以上述方式显示差异.请引导我使用代码段.谢谢

t-sql sql-server-2005 xquery-sql

9
推荐指数
1
解决办法
1万
查看次数

更新XML列SQL Server 2008中的子字符串

我想对SQL Server 2008中的XML列中的所有行执行更新,仅替换某个xml节点中的子字符串.我是XML DML/XQuery的新手,所有这一切,我只是无法弄清楚如何做到这一点.

我要更新的列中的XML示例:

<d>
  <p n="Richedit01" t="System.String">
    <v>
      &lt;p&gt; &lt;img border="0" alt="Football4" src="/$-1/football4.jpg" /&gt; &lt;/p&gt;
    </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)

sql-server xquery sql-server-2008 xquery-sql

8
推荐指数
1
解决办法
5376
查看次数

使用TRANSACT-SQL将节点添加到XML

我一直在努力处理这段简单的代码而没有结果.我只是想在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之前,我必须首先设置一些东西吗?有什么建议为什么这不起作用?

提前致谢!

xml t-sql sql-server xquery-sql

8
推荐指数
1
解决办法
1万
查看次数

在SQL server中学习XQuery()

SQL Server 2008 sp2

我是初学者,发现XQuery语法特别是XPath非常具有挑战性.例如,尝试使用各种xml方法,如exists(),nodes(),value()等....

是否有一个很好的在线教程或您推荐的书籍?

sql-server sql-server-2008 xquery-sql

7
推荐指数
1
解决办法
1万
查看次数

使用SQL将XML结构转置/展平为列

我正在使用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)

所以,目前我有以下内容: …

xml t-sql sql-server pivot xquery-sql

7
推荐指数
1
解决办法
6085
查看次数

在where子句中哪个更快.exist或.value?

我正在使用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可能会更快?

sql-server performance xpath xquery-sql

6
推荐指数
1
解决办法
3653
查看次数

XQUERY - 如何在'value()'函数中使用sql:variable?

下面的查询试图选择给定节点的子节点.如何使用变量而不是硬编码子节点,以便我可以将它们作为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)

sql sql-server sql-server-2008 xquery-sql

6
推荐指数
1
解决办法
7953
查看次数

如何使用Sql获取XML属性的值:xquery中的变量

我想使用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)值.

sql t-sql sql-server xquery-sql

6
推荐指数
1
解决办法
3087
查看次数