标签: xml

无法从存储在表列中的 XML 中读取数据

我有一些数据以 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 中获取实际值吗?

xml sql-server

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

Select 语句来检索 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)

Table1Table2通过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)

sql-server-2005 xml

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

SQL Server xml 性能

我有一个 21 列的表。大多数是数字,其余的是nvarchar

我需要添加 4 列,这些列将包含每行的 XML 数据。每行的 XML 数据可以是 200 到 2,000 行。

问题是:

  • 将 XML 类型的列添加到同一个表是否会改变查询该表的速度?

  • 当我将 xml 类型的列添加到另一个表并在执行查询时连接两个表时,有什么性能优势?

  • 对 XML 数据进行编码以缩小它并在应用程序中对其进行解码是否更好?

performance xml sql-server sql-server-2008-r2

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

查询未按原始顺序返回项目

考虑以下集合,它是刚刚为针对它运行的查询创建的表变量 @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)

xml sql-server

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

涉及 XML 列的两个类似查询的相对成本

我有两个查询,如下所示,它们做同样的事情。这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)

performance sql-server-2008 xml execution-plan

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

从 xml 列中提取整数值

我只是想知道如何从 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)

xml sql-server t-sql substring

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

提高将大型 xml 文件 (~300 MB) 转换为 SQL Server 中的关系表的性能

所以这就是我到目前为止所拥有的:

--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)

performance xml sql-server xquery

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

为什么SQL函数总是返回空结果集?

下面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)

xml sql-server sql-server-2012

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

SQL Server 在 XML 字段中选择

我需要以下情况的帮助:

在我的表 SQLServer 2012 中有一个带有 xml 值的字段,我想选择该字段中的数据并在表单列中显示结果。

图片1

<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)

谢谢你。

xml sql-server sql-server-2012 sql-server-2014

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

使用探测残差识别执行计划

我正在尝试找出具有Probe Residual.

需要了解以下内容

  1. 哪个物理和逻辑运算符有这个 Probe Residual
  2. 查询中该运算符的成本百分比是 多少
  3. 相关执行计划
  4. 查询文本

以下是我的一次尝试——但我被困在获取其他细节上。如何获取这些详细信息?

注意:我使用的是 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 的博客/文章

  1. 哈希匹配上的探针残差 - 可怕的 DBA 之家
  2. 当你有一个哈希匹配时探测残差——执行计划中的隐藏成本

xml sql-server execution-plan sql-server-2012 plan-cache

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