我有一个名称表:
表A
John
Jim
Jason
Run Code Online (Sandbox Code Playgroud)
和一个 xml 字符串表:
表B
示例 1
<Show Title="" ShowTitle="=False" ShowLine="=False" ShowDescription="=False" ShowExpandCollapse="=False" IsVisible="=True" Description="" PageBreakAfter="=False" PageCaption="" AppLink="" InfoLink="" ImageLink="" Pause="=False" PauseMessage="" PauseMessageStyle="" PauseTitle="" ScreenStyle="">
<ShowOption Sequence="1" Name="Jim" Caption="Test" SelectOptionsImageLinkFieldExpression="ImageLink" />
</Show>
Run Code Online (Sandbox Code Playgroud)
示例 2
<vars>
<var name="MatrixName">
<value>="LockExitPairCompatability"</value>
</var>
<var name="Jason">
<value>=If(Exists(Minute.Value.Min), ToNumber(Minute.Value.Min), 0)</value>
</var>
<var name="MinNum">
<value>=If(Exists(Agency) AND Agency = "Cert", 0, MinNum)</value>
</var>
<var name="Where">
<value>="Site='" + Root.Site + "' AND HWType IN " + ToSQLArray(Root.Components[ActiveDoor].HardwareType)</value>
</var>
<var name="Where2">
<value>=" AND HWSubType IN " …Run Code Online (Sandbox Code Playgroud) 我有一个要求,我希望 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)
怎么做?
此页面https://msdn.microsoft.com/en-us/library/ms188276.aspx表示如果您想要嵌套的 XML(即 XML 树),那么您需要像这样设置查询:
SELECT Col1,
Col2,
( SELECT Col3, Col4
FROM T2
WHERE T2.Col = T1.Col
...
FOR XML AUTO, TYPE )
FROM T1
WHERE ...
FOR XML AUTO, TYPE;
Run Code Online (Sandbox Code Playgroud)
(使用子查询)
这与索引视图的要求完全不一致(不允许子查询)。
有没有办法将这两个功能结合在一起?(有一个带有 XML 树的索引视图?)
我的问题的不足是: 如何在不使用任何子查询或联合的情况下从许多表创建 XML 树(即嵌套的 XML 节点)。(因此它将与 SQL Server 索引视图一起使用。)
仅供参考:不确定是否重要,但我的特定查询有超过 10 个级别的 xml 树(从一堆不同的表中提取)。
我是 OPENXML 的新手,并且有 90% 的我想做的工作......坚持这个:
<ReportHost name="411.114.42.42">
<HostProperties>
<tag name="HOST_END">Wed Nov 11 20:48:43 2015</tag>
<tag name="LastAuthenticatedResults">8675309</tag>
<tag name="Credentialed_Scan">true</tag>
<tag name="policy-used">AWT v6</tag>
<tag name="ssh-auth-meth">MyPassword</tag>
<tag name="ssh-login-used">MyLogin</tag>
<tag name="local-checks-proto">ssh</tag>
<tag name="host-ip">411.114.42.42</tag>
<tag name="HOST_START">Wed Nov 11 20:00:01 2015</tag>
</HostProperties>
</ReportHost>
Run Code Online (Sandbox Code Playgroud)
我想要的结果:
Wed Nov 11 20:48:43 2015
8675309
TRUE
AWT v6
MyPassword
MyLogin
ssh
411.114.42.42
Wed Nov 11 20:00:01 2015
Run Code Online (Sandbox Code Playgroud)
我可以获取名称值(“Host_end”等),但不能获取内容。
我的查询:
Select *
from OPENXML (@hdoc,'/ReportHost/HostProperties/tag',1)
WITH (
name varchar (500)
)
Run Code Online (Sandbox Code Playgroud)
如果可能的话,我想坚持使用 OPENXML,因为我只是花了一天的时间学习它并进入最后一步。
如果我提供了足够的信息,请告诉我。
我可以查询 XML,它定义了带有公共表表达式的xmlns标记
DECLARE @XML XML
SET @XML =
'<NodeA xmlns="https://XYZ.xsd">
<NodeB verzePis="">
<NodeC1 attrA="Hello" />
<NodeC2 attrA="World" />
</NodeB>
</NodeA>
'
;WITH XMLNAMESPACES(DEFAULT 'https://XYZ.xsd')
SELECT
r.value('fn:local-name(.)', 'nvarchar(50)') as SectionName,
r.value('@attrA','NVARCHAR(250)') attrA
FROM @XML.nodes('/NodeA/NodeB/*') AS t(r);
Run Code Online (Sandbox Code Playgroud)
但是如果源 XML 不包含任何 xmlns 标记呢?如何解决缺少命名空间的问题?
我试图在 SQL Server 2000 SP4 中运行以下代码,但出现错误。
Declare @Body varchar(8000);
Declare @TableHead varchar(8000);
Declare @TableTail varchar(8000);
Set NoCount On;
Set @TableTail = '</table></body></html>';
Set @TableHead = '<html><head>' +
'<style>
td {border: solid black 1px;padding-left:5px;padding-right:5px;padding-top:1px;padding-bottom:1px;font-size:11pt;}
tr.even {background-color:white;}
tr.odd {background-color:#eeeeee;}
</style>' +
'</head>' +
'<body><table cellpadding=0 cellspacing=0 border=0>' +
'<tr bgcolor=#FFEFD8><td align=center><b>Server Name</b></td>' +
'<td align=center><b>Product</b></td>' +
'<td align=center><b>Provider</b></td>' +
'<td align=center><b>Data Source</b></td>' +
'<td align=center><b>Is Linked?</b></td></tr>';
Select @Body = (Select
name As [TD],
product As [TD],
provider As [TD],
data_source As [TD …Run Code Online (Sandbox Code Playgroud) 在 SQL Server 数据库中存储和/或使用 XML 架构的真实生产环境示例是什么?
我正在按照 Microsoft 70-461 考试目标努力工作。我已经完成了 Microsoft 在https://technet.microsoft.com/en-us/library/ms176009(v=sql.110).aspx 上的数据库中创建和存储 XML 模式的 演练。
我还没有在应用程序将访问存储在数据库中的 XML 模式的数据库环境中工作。在生产 SQL Server 数据库中创建和存储 XML 架构的真实用例是什么?
我想在sql中读取xml的节点值,我的xml看起来像这样
我只想读取“订单 1”的订单节点的值,我的代码是
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc
SELECT * FROM OPENXML (@idoc, '/ROOT/Customer/Order',0)
WITH (
[Order] varchar(100)
);
Run Code Online (Sandbox Code Playgroud) 使用 Forrest 的这个解决方案:
DECLARE @XML xml =
'<?xml version="1.0" encoding="UTF-8"?>
<Orders>
<Order>
<OrderID>334</OrderID>
<AmountPaid currencyID="EUR">17.10</AmountPaid>
<UserID>marc58</UserID>
<ShippingAddress>
<Name>Marc Juppé</Name>
<Address>Rue garçonneé III° arrondissement</Address>
<City>Paris</City>
<StateOrProvince></StateOrProvince>
<Country>FR</Country>
<Phone>333333333</Phone>
<PostalCode>22222</PostalCode>
</ShippingAddress>
<ShippingCosts>4.50</ShippingCosts>
<Items>
<Item>
<Details>
<ItemID>3664</ItemID>
<Store>47</Store>
<Title>MCPU DDA010</Title>
<SKU>mmx</SKU>
</Details>
<Quantity>1</Quantity>
<Price currencyID="EUR">6.2</Price>
</Item>
<Item>
<Details>
<ItemID>3665</ItemID>
<Store>45</Store>
<Title>MCPU DFZ42</Title>
<SKU>mmy</SKU>
</Details>
<Quantity>2</Quantity>
<Price currencyID="EUR">3.2</Price>
</Item>
</Items>
</Order>
</Orders>'
SELECT
x.value('./ItemID[1]','int') AS ItemID,
x.value('./Store[1]','int') AS Store,
x.value('./Title[1]','nvarchar(100)') AS Title,
x.value('./SKU[1]','nvarchar(100)') AS SKU,
x.value('../Quantity[1]','int') AS Qty,
x.value('../Price[1]','decimal(11,2)') AS Price,
x.query('//OrderID[1]').value('.','int') AS OrderID, …Run Code Online (Sandbox Code Playgroud) 我们有将 XML 数据存储为 varchar(MAX) 的大表。数据仅供参考/历史用途,不作查询。根据我所读到的内容,存储为 XML 数据类型而不是 VARCHAR(MAX) 应该可以节省空间,但我的测试显示并非如此。见下文,其中 t1_XML 的大小小于 t1_NVARCHARMAX,但大于 t1_VARCHARMAX。
set nocount on;
drop table t1_XML;
drop table t1_VARCHARMAX;
drop table t1_NVARCHARMAX;
create table t1_XML(col1 int identity primary key, col2 XML);
create table t1_VARCHARMAX(col1 int identity primary key, col2 varchar(max));
create table t1_NVARCHARMAX(col1 int identity primary key, col2 nvarchar(max));
go
declare @xml XML = '<root><element1>test</element1><element2>test</element2><element3>test</element3><element4>test</element4><element5>test</element5></root>'
, @x int = 1;
while @x <= 10000
begin
begin tran
insert into dbo.t1_XML (col2) values (@xml);
insert into dbo.t1_VARCHARMAX (col2) …Run Code Online (Sandbox Code Playgroud)