我有以下 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) 我有一个包含 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 文件 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) 我的老板要我解析存储在表中的一组查询计划,并确定每个计划中存在多少具有无序预取的嵌套循环运算符。我只有大约 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 文档:
<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 文件。
<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 标记在我的 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)
怎么做?
我想透视 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 列的数据库。我正在尝试更新(修剪) 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 值
我有以下 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)