我有一些数据以 XML 格式存储在表中:
<AccountTypes xmlns="">
<Id>1003</Id>
<Id>2</Id>
<Id>3</Id>
<Id>1004</Id>
<Id>1002</Id>
<Id>0</Id>
</AccountTypes>
Run Code Online (Sandbox Code Playgroud)
这是以前仅在 C# 代码中处理的旧数据,因此无法更改。
我现在需要阅读此内容并在存储过程中对其进行处理。到目前为止我已经得到以下代码:
DECLARE @accountTypes XML
SELECT @accountTypes = DT.AccountTypes FROM dbo.DataTable AS DT
WHERE DT.Id = 1016
DECLARE @hdoc int
EXEC sys.sp_xml_preparedocument @hdoc OUTPUT, @accountTypes
SELECT *
FROM OPENXML (@hdoc, '/AccountTypes/Id')
WITH(
Id VARCHAR(10) 'Id'
)
EXEC sys.sp_xml_removedocument @hdoc
Run Code Online (Sandbox Code Playgroud)
然而,其输出只是空行:
Id
NULL
NULL
NULL
NULL
NULL
NULL
Run Code Online (Sandbox Code Playgroud)
而不是我期望的 id 值。
无论是否包含colpattern('Id') 或者是否在命令flags上设置参数,我都会得到相同的结果OPENXML。
我可以对当前形式的数据做些什么来从 XML 中获取实际值吗?
有人可以为我提供一些线索或解决方案来检索如下记录集吗?
注意:我阅读了 msdn 文档,但除了脱发之外别无他法:(
只是假设我有 2 个表通过 Rid 字段连接
表 1 列:
Rid, UserName, Hash
Run Code Online (Sandbox Code Playgroud)
表 2 列:
Rid, Phone, City, Email
Run Code Online (Sandbox Code Playgroud)
Table1并Table2通过Rid柱连接。
我想使用 xml 自动或 xml 显式或您在 SQL Server 2005 Express 中获得的任何 xml 操作来获得 xml 输出。
预期输出:
<UserDetails>
<Account>
<UserName>
</UserName>
<Hash>
</Hash>
</Account>
<Personal>
<Phone>
</Phone>
<City>
</City>
</Personal>
</UserDetails>
Run Code Online (Sandbox Code Playgroud)
@matt 请查看我在下面创建的程序。当您在开始时使用代码执行存储过程时,您就会知道我面临的问题
stack_getusers '<Request Type="GetUsers" CRUD="R">
<UserDetails>
<Rid></Rid>
</UserDetails>
</Request>'
CREATE PROCEDURE [dbo].[stack_getusers]
@doc NTEXT
AS
DECLARE @idoc INT
EXEC sp_xml_preparedocument @idoc OUTPUT, …Run Code Online (Sandbox Code Playgroud) 我有一个 21 列的表。大多数是数字,其余的是nvarchar。
我需要添加 4 列,这些列将包含每行的 XML 数据。每行的 XML 数据可以是 200 到 2,000 行。
问题是:
将 XML 类型的列添加到同一个表是否会改变查询该表的速度?
当我将 xml 类型的列添加到另一个表并在执行查询时连接两个表时,有什么性能优势?
对 XML 数据进行编码以缩小它并在应用程序中对其进行解码是否更好?
考虑以下集合,它是刚刚为针对它运行的查询创建的表变量 @ProductContent 的内容:
请注意项目是如何按 media_type_id、image_weight、image_id 和最后的 image_width DESC 排序的。如果我运行以下查询:
SELECT -- <images>
pcs.image_type AS [@Type]
,pcs.image_type_id AS [@ImageTypeId]
,(
SELECT -- <imageCollection>
pcc.image_id AS [@Guid]
,pcc.image_angle AS [@Angle]
,pcc.image_weight AS [@Weight]
,(
SELECT -- <image>
pci.mime_type AS [@MimeType]
,pci.content_guid AS [@Guid]
,pci.url AS [@Url]
,pci.media_type_id AS '@MediaTypeId'
,t.media_type_description '@Description'
,(
SELECT DISTINCT -- <attribute>
a.meta_attribute_id '@Id'
,a.meta_attribute_name '@Name'
,v.meta_value_name AS '@Value'
FROM [ADS2].dbo.ads_digital_content_meta m
JOIN [ADS2].dbo.ads_digital_content_meta_atr_voc a ON a.meta_attribute_id = m.meta_attribute_id
JOIN [ADS2].dbo.ads_digital_content_meta_value_voc v ON v.meta_value_id = m.meta_value_id
WHERE m.content_guid …Run Code Online (Sandbox Code Playgroud) 我有两个查询,如下所示,它们做同样的事情。这xmlcolumn是一个数据类型为 XML 的列。我使用这些查询在 XML 列中的任何位置搜索字符串。
我检查了这两个查询的执行计划,发现第一个查询的 I/O 成本和子树成本低于第二个。我原以为第一个会在使用cast和 时具有更高的成本charindex,但事实并非如此。
为什么它的成本更低?
第一个查询:
SELECT *
FROM mytable
WHERE ( Charindex('abc',CAST([xmlcolumn] AS VARCHAR(MAX)))>0 )
Run Code Online (Sandbox Code Playgroud)
第二个查询:
SELECT *
FROM mytable t1
WHERE t1.[xmlcolumn].exist('//*/text()[contains(.,"abc")]')=1
Run Code Online (Sandbox Code Playgroud) 我只是想知道如何从 XML 列中提取一个整数。目前所有的数字都是 4,下面的查询可以做到。但是这个数字很快就会增长到 10,000 个,这意味着 5 位数,这个查询将无法做到。无论如何,我是否可以动态地从 Xml 列的中间<siteID>和中间取出任何整数</siteID>。任何建议将不胜感激。
SELECT
SUBSTRING(msg, patindex('%[0-9][0-9][0-9][0-9]</siteID>%',msg),4) AS DOMAIN
FROM table a(NOLOCK)
WHERE msg like '<DLR%'
ORDER BY 1 DESC
Run Code Online (Sandbox Code Playgroud) 所以这就是我到目前为止所拥有的:
--Read xml content into a XML data type variable
DECLARE @FileData XML
SELECT @FileData = CONVERT(XML, BulkColumn)
FROM OPENROWSET(BULK '\\file_path\test.xml', SINGLE_BLOB) AS x
--Read from the XML variable to create Entity-Attribute-Value table
SELECT N1.Id.value('@Id', 'varchar(50)') as Id
, N1.Id.value('@Name', 'varchar(100)') as Name
, N2.AttributeLongName.value('@AttributeName', 'varchar(100)') as AttributeName
, N3.AttributeValue.value('.', 'varchar(MAX)') as AttributeValue
FROM @FileData.nodes('/Data/Entities/Entity') as N1(Id) ---1st lvl Node contains the Entity
cross apply Id.nodes('Attributes/Attribute') as N2(AttributeName) --2nd lvl Node contains AttributeName
cross apply AttributeName.nodes('Values/Value') as N3(AttributeValue) --3rd lvl …Run Code Online (Sandbox Code Playgroud) 下面function我写了接受xml并返回table结果。
CREATE FUNCTION FunctionTest(@ID INT,@XML_Details xml)
RETURNS @RESULT TABLE
(
Value1 INT,
Value2 INT
)
AS
BEGIN
DECLARE @tbl_Xml_Result Table
(
Value1 INT,
Value2 INT
)
INSERT INTO @RESULT(Value1,Value2)
SELECT
l.v.value('Value2[1]','INT'),
l.v.value('Value1[1]','INT')
FROM @XML_Details.nodes('/Listings/listing')l(v)
RETURN
END
Run Code Online (Sandbox Code Playgroud)
以下是我用来运行上面的代码,function但它总是返回Empty结果。
DECLARE @tbl_Xml_Result Table
(
Value1 INT,
Value2 INT
)
INSERT INTO @tbl_xml_Result
values(1,2),(2,3),(3,4),(4,5),(5,6)
DECLARE @xml_Temp xml
SET @xml_Temp = ( SELECT *
FROM @tbl_xml_Result
FOR XML PATH('Listing'),ROOT('Listings')
)
DELETE FROM @tbl_xml_Result
INSERT INTO …Run Code Online (Sandbox Code Playgroud) 我需要以下情况的帮助:
在我的表 SQLServer 2012 中有一个带有 xml 值的字段,我想选择该字段中的数据并在表单列中显示结果。
<row>
<ID_Cota>162986</ID_Cota>
<ID_Taxa_Plano>1000</ID_Taxa_Plano>
<ID_Plano_Venda>1020</ID_Plano_Venda>
<ID_Pessoa>18522</ID_Pessoa>
</row>
Run Code Online (Sandbox Code Playgroud)
谢谢你。
我正在尝试找出具有Probe Residual.
需要了解以下内容
Probe Residual 以下是我的一次尝试——但我被困在获取其他细节上。如何获取这些详细信息?
注意:我使用的是 SQL Server 2012
WITH XMLNAMESPACES
(
DEFAULT 'http://schemas.microsoft.com/sqlserver/2004/07/showplan'
)
SELECT
DECP.cacheobjtype,
DECP.objtype,
DECP.plan_handle,
DEQP.objectid,
DEQP.query_plan,
DEST.[text]
FROM sys.dm_exec_cached_plans AS DECP
CROSS APPLY sys.dm_exec_query_plan(DECP.plan_handle) AS DEQP
CROSS APPLY sys.dm_exec_sql_text(DECP.plan_handle) AS DEST
WHERE
1 = DEQP.query_plan.exist(
'//RelOp[
@PhysicalOp = "Hash Match"
]')
Run Code Online (Sandbox Code Playgroud)
甲探头残余例
下面引用 Grant Fritkey 和 Rob Farley 的博客/文章