标签: xquery

如何在 SQL Server 中的 xquery 中转换值列表?

我有以下 T-SQL 代码,我正在尝试开始工作:

IF EXISTS (SELECT * FROM sys.xml_schema_collections WHERE name = 'TST') DROP XML SCHEMA COLLECTION TST; 
GO
CREATE XML SCHEMA COLLECTION TST AS N'<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"><xsd:element name="root"><xsd:complexType><xsd:complexContent><xsd:restriction base="xsd:anyType"><xsd:sequence><xsd:element name="val" minOccurs="0" maxOccurs="unbounded" type="xsd:string" /></xsd:sequence></xsd:restriction></xsd:complexContent></xsd:complexType></xsd:element></xsd:schema>';
GO
DECLARE @xml XML(TST) = '<root><val>1</val><val>2</val><val>3</val></root>';

SELECT @xml.value('sum(//val)','INT')
Run Code Online (Sandbox Code Playgroud)

xsd告诉我们,val节点类型string。因此该sum()功能将不起作用:

Msg 9308, Level 16, State 1, Line 7
XQuery [value()]: The argument of 'sum()' must be of a single numeric primitive type or 'http://www.w3.org/2004/07/xpath-datatypes#untypedAtomic'. Found argument of type 'xs:string …
Run Code Online (Sandbox Code Playgroud)

sql-server xquery

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

如何查询 XML 列集中的确切值

我有一个包含 80 多个稀疏列和一个列集列的表,这是一个简单的例子:

DROP TABLE IF EXISTS #ColumnSet
GO

CREATE TABLE #ColumnSet
(
    Id        INT          NOT NULL
  , Value1    VARCHAR(100) SPARSE NULL 
  , Value2    VARCHAR(100) SPARSE NULL 
  , Value3    VARCHAR(100) SPARSE NULL 
  , Value4    VARCHAR(100) SPARSE NULL 
  , AllValues XML COLUMN_SET FOR ALL_SPARSE_COLUMNS
)
GO

INSERT INTO #ColumnSet
(Id, Value1, Value2, Value3, Value4)

VALUES
(1, 'POSITIVE', NULL, NULL, NULL),
(2, 'NEGATIVE', NULL, 'NEGATIVE', NULL),
(3, NULL, NULL, 'NEGATIVE', 'POSITIVE'),
(4, 'NEGATIVE', NULL, 'THIS IS NOT A POSITIVE RESULT', NULL)
GO …
Run Code Online (Sandbox Code Playgroud)

xml sql-server xquery sql-server-2016 sparse-column

6
推荐指数
2
解决办法
1150
查看次数

如何将 XML 数组拆分为单独的行(同时保持一致性)

我正在处理这个确切的堆栈交换部分的数据库转储。在我处理它的过程中,我遇到了一个我目前无法解决的问题。

在 XML 文件 Posts.xml 中,内容如下所示

在此处输入图片说明

当然有多行,但这就是一个的样子。转储中已经提供了一个 Tags.xml 文件,这使得该图片中的“Tags”属性实际上应该是它的单独表(多对多)变得更加明显。

所以现在我正试图找出一种如何提取标签的方法。这是我尝试做的:

CREATE TABLE #TestingIdea (
Id int PRIMARY KEY IDENTITY (1,1),
PostId int NULL,
Tag nvarchar (MAX) NULL
)
GO
Run Code Online (Sandbox Code Playgroud)

? 我创建的表来测试我的代码。我已经用标签和 PostIds 填充了它

SELECT  T1.PostId,
        S.SplitTag
FROM (
    SELECT  T.PostId, 
            cast('<X>'+ REPLACE(T.Tag,'>','</X><X>') + '</X>' as XML) AS NewTag
    FROM #TestingIdea AS T
    ) AS T1
CROSS APPLY (
    SELECT tData.value('.','nvarchar(30)') SplitTag
    FROM T1.NewTag.nodes('X') AS T(tData)
    ) AS S
GO
Run Code Online (Sandbox Code Playgroud)

然而此代码返回此错误

XML parsing: line 1, character 37, illegal qualified name character …
Run Code Online (Sandbox Code Playgroud)

xml sql-server xquery string-splitting sql-server-2017

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

如何解析查询计划以获取具有无序预取的嵌套循环运算符的计数?

我的老板要我解析存储在表中的一组查询计划,并确定每个计划中存在多少具有无序预取的嵌套循环运算符。我只有大约 100 个查询计划,所以性能不是很重要。我尝试自己做,但很快就糊涂了,无法取得进展。

表的结构:

DROP TABLE IF EXISTS dbo.query_plans;

CREATE TABLE dbo.query_plans (
plan_name VARCHAR(100),
query_xml XML
);
Run Code Online (Sandbox Code Playgroud)

我上传了 T-SQL 以向pastebin上的表添加三个示例查询计划。这是我正在寻找的输出:

????????????????????????????????
?  plan_name  ? OPERATOR_COUNT ?
????????????????????????????????
? NO_PREFETCH ?              0 ?
? 1_PREFETCH  ?              1 ?
? 2_PREFETCH  ?              2 ?
????????????????????????????????
Run Code Online (Sandbox Code Playgroud)

我无法回答任何关于为什么我需要这样做的问题。谢谢!

xml sql-server execution-plan xquery

5
推荐指数
1
解决办法
493
查看次数

如何根据元素值返回 XML 节点序号,或删除节点?

我有一个与此类似的 XML 文档:

<Root>
  <Sub>
    <Record>
      <Guid>aslkjflaksjflkasjfkljsd</Guid>
    </Record>
    <Record>
       <Guid>opqiwuerl;kasdlfkjawop</Guid>
    </Record>
  </Sub>
</Root>
Run Code Online (Sandbox Code Playgroud)

我正在<Record>根据某些标准替换整个节点。该<Record>节点包含一个<Guid>,我可以用它来识别它们(那些假装是有效的GUID请!)。

知道了 GUID,我将该节点的 XML 返回到一个变量中以供进一步处理。在下游,我需要能够删除该特定节点,以便我可以insert将节点的修改版本恢复到原始文档中。

有没有办法确定序数,或者使用delete/replace方法根据元素的值删除节点的另一种方法?

xml sql-server-2008-r2 xquery

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

使用默认命名空间和不一致的根节点解析类型化 XML

我有一个结构化的、类型化的 xml 文件。

<WebService xmlns="http://www.orbis-software.com/WebSvcCon">
 <NewLeads>
  <OutputSchema>
  <root xmlns="" type="array">
   <item type="object">
   <SaleProperty type="object">
    <Type type="string">Freehold</Type>
    <PostDistrict type="string">xxx</PostDistrict>
    <Address type="string">address</Address>
     <Value type="number">17.0</Value>
   </SaleProperty>
   <Transaction type="string">SaleOnly</Transaction>
   <Quote type="object">
    <Sale type="object">
     <Fees type="number">450.0</Fees>
     <Disbursements type="number">0.0</Disbursements>
     <StampDuty type="number">0.0</StampDuty>
     <Total type="number">450.0</Total>
    </Sale>
   <Discount type="number">0.0</Discount>
   <VAT type="number">90.0</VAT>
   <Total type="number">540.0</Total>
  </Quote>
  <MoverId type="number">12345678</MoverId>
  <Name type="string">Mr AS</Name>
  <Email type="string">as@yahoo.ppp</Email>
  <Telephone type="string">0123456789</Telephone>
  <Comments type="string">Joint ownership</Comments>
  <EstimatedMoveDate type="string">2015-11-25T05:57:00</EstimatedMoveDate>
  <Charge type="number">4.99</Charge>
  <ChargeStatus type="string">Chargeable</ChargeStatus>
 </item>
</root>
</OutputSchema></NewLeads></WebService>
Run Code Online (Sandbox Code Playgroud)

此外,对象 SaleProperty 可能会丢失,而可能是对象 PurchaseProperty。类似地,对象 Quote 可以包含 Sale、Purchase、Remortgage 对象或同时包含 Sale 和 Purchase 我找不到任何关于通过 SQL Server …

xml sql-server sql-server-2012 xquery

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

带有不区分大小写标签的 XML 查询

我有一个要求,我希望 XML 标记在我的 xml 查询中不区分大小写。

例如:

DECLARE @myTable TABLE ( yourXML XML )  

INSERT INTO @myTable SELECT '<z><a><b>1</b><c>2</c></a></z>'
INSERT INTO @myTable SELECT '<Z><A><b>1</b><c>2</c></A></Z>'   

SELECT * FROM @myTable WHERE ( [yourXML].exist('for $x in /z/a where  ( ($x/b[1]) = 1 )  return $x')>0 ) 
Run Code Online (Sandbox Code Playgroud)

返回输出为

yourXML
<z><a><b>1</b><c>2</c></a></z>
Run Code Online (Sandbox Code Playgroud)

但我希望在不考虑 XML 标记大小写的情况下显示输出。所以我想要的输出应该是

yourXML
<z><a><b>1</b><c>2</c></a></z>
<Z><A><b>1</b><c>2</c></A></Z>
Run Code Online (Sandbox Code Playgroud)

怎么做?

xml sql-server sql-server-2008-r2 xquery

3
推荐指数
1
解决办法
4327
查看次数

使用 XQuery 正确旋转 XML 列

我想透视 SQL XML 列的属性和值,并以有序的列和行格式显示它。

首先,这是 XML 列在 SQL 中的样子:

<Model xmlns:dsc="ModelDescriptive" xmlns:draw="ModelDraw" xmlns:display="Display" xmlns:thd="Model3D">
  <dsc:Model name="15DE">
    <dsc:Defs>
      <dsc:Materials>
        <dsc:Material ref="E-HD-AnoAno" baseRef="E-HD" type="rod" productionGroup="OPTION" />
        <dsc:Material ref="E-3L44A-CLEAR" baseRef="E-3L44A" type="piece" productionGroup="OPTION" />
        <dsc:Material ref="R-TH01" baseRef="R-TH-TH" type="rod" productionGroup="ASSEMBLY" />
        <dsc:Material ref="M-TH05" baseRef="M-TH" type="meter" productionGroup="MOLDING" />
      </dsc:Materials>
    </dsc:Defs>
  </dsc:Model>
</Model>
Run Code Online (Sandbox Code Playgroud)

...这是我的查询:

 SELECT
      x.y.value('local-name(..)', 'VARCHAR(MAX)') ParentElementName
     ,x.y.value('local-name(.)', 'VARCHAR(MAX)') Attribut
     ,x.y.value('.', 'VARCHAR(MAX)') Value
     ,Row_number() Over(Partition by x.y.value('local-name(..)', 'VARCHAR(MAX)') order by x.y.value('local-name(..)', 'VARCHAR(MAX)') ASC)  as rn
 FROM @xmlDescriptive.nodes('//*[text()], //@*') AS x(y)
 WHERE x.y.value('local-name(..)', 'VARCHAR(MAX)')= 'Material'
 ORDER BY …
Run Code Online (Sandbox Code Playgroud)

xml pivot xquery sql-server-2014

3
推荐指数
1
解决办法
73
查看次数

修剪 MS SQL Server 中 xml 列中的值

我有一个带有 XML 列的数据库。我正在尝试更新(修剪) xml 列的 xml 值。我在 Windows、SQL Server 2008 Express 上运行。

我没有找到任何直接在 Xquery 中修剪的方法,所以我尝试通过选择该值。这是 SQL

select RTRIM(LTRIM(col2.value('(/Root/Row/Rowid/text())[1]','varchar(20)')))
from   dbo.T1
Run Code Online (Sandbox Code Playgroud)

但是现在我不知道如何更新这个 xml 值。

有没有办法直接修剪xml值?如果不是,我该如何修剪价值?

我不是要更新表中的单行,而是要修剪表中所有行的 xml 值

sql-server-2008 xml sql-server xquery trim

2
推荐指数
1
解决办法
2345
查看次数

如何使用 TSQL 解析 XHTML 节点值?

我有以下 XHTML 并希望能够解析出My Node Value。有没有办法用 TSQL 轻松做到这一点?

<SPAN style="WHITE-SPACE: normal; WORD-SPACING: 0px; TEXT-TRANSFORM: none; FLOAT: none; COLOR: rgb(0,0,0); TEXT-ALIGN: left; FONT: 10px verdana; DISPLAY: inline !important; LETTER-SPACING: normal; TEXT-INDENT: 0px; -webkit-text-stroke-width: 0px">My Node Value</SPAN>
Run Code Online (Sandbox Code Playgroud)

sql-server xquery

2
推荐指数
1
解决办法
337
查看次数