我正在从SQL Server查询生成XML文件.
我有一些关于排序元素问题的问题.
例如,有如下简单的代码.
<test>
<tree abc="123"/>
<tree abc="789"/>
<tree-order abc="456"/>
</test>
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,树和树顺序是不同的元素,我想按属性排序
<test>
<tree abc="123"/>
<tree-order abc="456"/>
<tree abc="789"/>
</test>
Run Code Online (Sandbox Code Playgroud)
像这样.
谁有好主意解决这个问题?
谢谢.
对不起,我有详细问题如下
AS是
<Main>
<test>
<tree abc="123"/>
<tree abc="789"/>
<tree-order abc="456"/>
</test>
<test>
<tree abc="123"/>
<tree abc="789"/>
<tree-order abc="456"/>
</test>
</Main>
Run Code Online (Sandbox Code Playgroud)
成为 :
<Main>
<test>
<tree abc="123"/>
<tree abc="456"/>
<tree-order abc="789/>
</test>
<test>
<tree abc="123"/>
<tree abc="456"/>
<tree-order abc="789/>
</test>
</Main>
Run Code Online (Sandbox Code Playgroud)
谢谢.
我有一个分层数据表,我试图选择作为单个分组的XML值:
列: Id, Type, SubType, SubSubType
样本数据:
Id Type Subtype SubSubType
1 Product Documentation Brochures Functional Brochures
2 Product Documentation Brochures Fliers
3 Product Documentation Data Sheets and Catalogs Data Sheets
4 Product Documentation Data Sheets and Catalogs Catalogs
5 Other Documentation Other classification User Guides
Run Code Online (Sandbox Code Playgroud)
对于上面的数据,我想输出以下xml:
<AllTypes>
<Type name="Product Documentation">
<SubType name="Brochures">
<SubSubType name="Functional Brochures"/>
<SubSubType name="Fliers"/>
</SubType>
<SubType name="Data Sheets and Catalogs">
<SubSubType name="Data Sheets"/>
<SubSubType name="Catalogs"/>
</SubType>
</Type>
<Type name="Other Documentation">
<SubType name="Other classification">
<SubSubType name="User Guides"/> …Run Code Online (Sandbox Code Playgroud) 我知道我可以通过使用在t-sql的表中的一列中搜索一个术语like %termToFind%.而且我知道我可以在表格中获得所有列:
SELECT *
FROM MyDataBaseName.INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = N'MyTableName`
Run Code Online (Sandbox Code Playgroud)
如何在表的每个列上执行类似的comprparison?我有一个非常大的桌子,所以我不能拼出LIKE每一列.
这是我的示例XML:
<root>
<element>
<subelement>
<value code="code1">value1</value>
<value code="code2">value2</value>
</subelement>
</element>
</root>
Run Code Online (Sandbox Code Playgroud)
这是我的测试查询:
DECLARE @tempTable TABLE (
ValueCode nvarchar(MAX),
Value nvarchar(MAX)
)
DECLARE @xml XML
select @xml = cast(c1 as xml) from OPENROWSET (BULK 'C:\test.xml', SINGLE_BLOB) as T1(c1)
INSERT INTO @tempTable
SELECT
Tbl.Col.value('subelement[1]/@code', 'NVARCHAR(MAX)'),
Tbl.Col.value('subelement[1]', 'NVARCHAR(MAX)')
FROM @xml.nodes('//element') Tbl(Col)
SELECT * FROM @tempTable
Run Code Online (Sandbox Code Playgroud)
执行时,查询会给出一行,其中ValueCode列包含NULL,而Value列包含'value1value2'.我想得到的是与分隔符连接的属性和值.例如,我需要ValueCode来包含'code1; code2'和值包含'value 1; 值2' .我怎样才能做到这一点?
假设我有一个表格数据如下:
我想选择Value包含该节点的所有(XML数据)Name="Hello World".我怎样才能实现它?
set @f = @XML.exist('/ArrayOfFilterColumn/SelectColumn[(@Name) eq "Hello World"]');
select @f;
Run Code Online (Sandbox Code Playgroud)
我不知道怎么能把它添加到我的地方,所以我把它放在一个小提琴里.
我已经尝试使用"FOR XML PATH","FOR XML EXPLICIT"和"FOR XML AUTO",但数据永远不会使用正确的层次结构.
基本上,我有一个父表(Customers)和3个子表.每个表都有一个customerid列.从Customers表到3个子表中的每一个都有一对多的关系.
作为一个模拟示例,我有一个父"客户"表,我有3个其他表 - 产品,爱好和车辆 - 所有与customerid相关的Customers表.
实现以下类型结构的SQL代码是什么 -
<Customers>
<Customer customerid="1" name="Fred">
<Products>
<Product productname="table" />
<Product productname="chair" />
<Product productname="wardrobe" />
</Products>
<Hobbies>
<Hobby hobbyname="Golf" />
<Hobby hobbyname="Swimming" />
</Hobbies>
<Vehicles>
<Vehicle name="Car" color="Red" />
<Vehicle name="Bicycle" color="Blue" />
</Vehicles>
</Customer>
<Customer customerid="2" name="Sue">
<Products>
<Product productname="CD player" />
<Product productname="Picture frame" />
</Products>
<Hobbies>
<Hobby hobbyname="Dancing" />
<Hobby hobbyname="Reading" />
</Hobbies>
<Vehicles>
<Vehicle name="Car" color="Yellow" />
</Vehicles>
</Customer>
</Customers>
Run Code Online (Sandbox Code Playgroud) 我在查询存储在SQL Server 2012数据库中的XML数据时遇到问题.我想查询的节点树采用以下格式 -
<eForm>
<page id="equalities" visited="true" complete="true">
<Belief>
<item selected="True" value="Christian">Christian</item>
<item selected="False" value="Jewish">Jewish</item>
...
</Belief>
</page>
</eForm>
Run Code Online (Sandbox Code Playgroud)
我想要做的是返回item节点的value属性,其中selected属性等于true.我已经阅读了几篇关于在SQL中查询XML的教程,但似乎无法正确获取代码.
谢谢斯图
使用SQL 2012并将XML传递到存储过程,该存储过程必须接受该输入并为传递给存储过程的XML部分中的每个项目写一行.XML看起来像:
<MyXML>
<MyMsg>My Text Message</MyMsg>
<MsgTime>2013-09-25 10:52:37.098</MsgTime>
<SendToList>
<SendTo>John</SendTo>
<SendTo>James</SendTo>
<SendTo>Rob</SendTo>
<SendTo>Pete</SendTo>
<SendTo>Sam</SendTo>
</SendToList>
</MyXML>
Run Code Online (Sandbox Code Playgroud)
存储过程的输出应该是插入表中的5行(SendTo上面各有一行),并且每个表在该表中的MyMsg和MsgTime字段中具有相同的值.
我可以得到数量的计数,SendTo并可以获得XML,SendToList但我不知道如何迭代它来进行插入.
我可以使用以下SQL来获取XML中的内容.
SELECT
x.value('(/MyXML/MyMsg)[1]', 'VARCHAR(1024)'),
x.value('(/MyXML/MsgTime)[1]', 'DATETIME'),
@max = x.query('<e> { count(/MyXML/SendToList/SendTo) } </e>').value('e[1]','int'),
@mlst = x.query('/MyXML/SendTo')
FROM @XML_In.nodes('//MyXML') i(x)
Run Code Online (Sandbox Code Playgroud)
目前,我正在使用变量和a WHILE来遍历SendToList中的项目,但我知道必须有更好的方法.
SELECT @msgTo= @XML_In.value('(/MyXML/SendToList/SendTo[position()=sql:variable("@cnt")])[1]','VARCHAR(100)')
Run Code Online (Sandbox Code Playgroud)
上面的内容为我提供了SendToList中每个项目的值.
如果我选择变量@mlst,我可以看到我需要循环的XML结构.
<SendToList>
<SendTo>John</SendTo>
<SendTo>James</SendTo>
<SendTo>Rob</SendTo>
<SendTo>Pete</SendTo>
<SendTo>Sam</SendTo>
</SendToList>
Run Code Online (Sandbox Code Playgroud)
即使是WHILE作品,它也会一个接一个地插入.我认为可用的方法应该能够完成而不是循环,但我不知道如何使用它们做我需要做的事情.
将不胜感激任何帮助或建议.
给定一个 XML 类型的字符串,例如
declare @xml xml
SET @xml =
'<PO>
<Amount type="approved">10.00</Amount>
<Year type="">2013</Year>
<GeneralNotes>
<Note>
<NoteText type="instruction">CallVendor</NoteText>
<Date type="">1-1-2013</Date>
</Note>
<Note type="">
<NoteText type="instruction">ShipNow</NoteText>
<Date type="">2-2-2013</Date>
</Note>
</GeneralNotes>
</PO>'
Run Code Online (Sandbox Code Playgroud)
我想获取每个元素及其属性(如果有的话)。我想要的输出(没有重复)是
ElementName ElementAttribute
PO
Amount approved
Note instruction
Run Code Online (Sandbox Code Playgroud)
我试过类似于这一行的代码
SELECT T.doc.query('fn:local-name(.)')
FROM @xml.nodes('PO//*[1]') AS T(doc)
Run Code Online (Sandbox Code Playgroud)
这会导致重复,我不确定如何选择属性值。我只需要第一次出现(即。GeneralNotes/Note[1])。我有一个包含许多其他元素名称的大文件,所以我不想单独解析它们。
我想知道,如何将 XML 内容从任意文件加载到局部变量中?
这适用于固定文件:
DECLARE @xml XML
SET @xml =
(
SELECT *
FROM OPENROWSET(BULK 'C:\data.xml', SINGLE_BLOB) AS data
)
Run Code Online (Sandbox Code Playgroud)
但是,我想从任何任意文件加载数据。
这不起作用(因为 BULK 似乎只支持 String 参数)
DECLARE @file NVARCHAR(MAX) = 'C:\data.xml'
DECLARE @xml XML
SET @xml =
(
SELECT *
FROM OPENROWSET(BULK @file, SINGLE_BLOB) AS data
)
Run Code Online (Sandbox Code Playgroud)
我还尝试了以下操作(没有成功,因为执行 EXEC 时局部变量(@xml)似乎超出了范围):
DECLARE @file NVARCHAR(MAX) = 'C:\data.xml'
DECLARE @xml XML
DECLARE @bulk NVARCHAR(MAX) = 'SET @xml = (SELECT * FROM OPENROWSET(BULK ''' + @file + ''', SINGLE_BLOB) AS data)'
EXEC (@bulk)
Run Code Online (Sandbox Code Playgroud)
我猜我需要使用临时表,但是如何使用?