sql - 如何查询包含 XML(不是 xml 列类型)的 SQL Server TEXT 列中的值

标签 sql sql-server xml tquery

我有表文档:

DOCUMENTS
____________________
DOCUMENTID   int
USERID       int
CONTENT      text

我将以下 XML 存储在 SQL Server 数据库中名称为 CONTENT 的 TEXT 列中

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<IDMSDocument>
    <DocumentContent>
        <Attribute Name="Number" GUID="{FFFFFFFF-0000-0000-0000-000000000001}">
            <IDMSType>3060</IDMSType>
            <Value Type="Integer">
                <Value>122</Value>
            </Value>
        </Attribute>
        <Attribute Name="Date" GUID="{FFFFFFFF-0000-0000-0000-000000000002}">
            <IDMSType>3061</IDMSType>
            <Value Type="DateTime">
                <Date>10-09-2014</Date>
            </Value>
        </Attribute>
        <Attribute Name="Публикуване" GUID="{CA646F55-5229-4FC5-AA27-494B25023F4E}">
            <IDMSType>3062</IDMSType>
            <Value Type="String">
                <Value>Да</Value>
            </Value>
        </Attribute>
        <Attribute Name="Дата" GUID="{AC0465B0-4FB4-49E2-B4FA-70901068FD9B}">
            <IDMSType>3063</IDMSType>
            <Value Type="DateTime">
                <Date>01-10-2014</Date>
            </Value>
        </Attribute>
        <Attribute Name="Предмет на поръчка" GUID="{04A4EC72-6F33-461F-98DD-D8D271997788}">
            <IDMSType>3065</IDMSType>
            <Value Type="String">
                <Value>Избор на консултанти</Value>
            </Value>
        </Attribute>
    </DocumentContent>
</IDMSDocument>

我找到了一种方法,如何通过大量转换从表中的单行中查询 dingle XML 属性:

DECLARE @strContent NVARCHAR(MAX);
DECLARE @xmlContent XML;
SET @strContent = (select content from DOCUMENTS where DocumentID=24);
SET @xmlContent = CAST(REPLACE(CAST(@strContent AS NVARCHAR(MAX)),'utf-8','utf-16') AS XML) 
SELECT @xmlContent.query('/IDMSDocument/DocumentContent/Attribute[5]/Value/Value') 
where @xmlContent.value('(/IDMSDocument/DocumentContent/Attribute[5]/Value/Value)[1]', 'nvarchar(max)') like '%search%'

我需要进行查询,例如“选择表中 XML 中第五个属性具有值‘搜索’的所有行”

对我来说,一般问题是列类型不是 XML,但我有文本列,其中存储了 xml。当我尝试转换、查询、值直接服务器返回时,我只能将它用于 XML 列。

如果有人建议如何做到这一点,我将不胜感激!

谢谢!

假面

最佳答案

SQL Server 不允许内联 XML 转换应用函数,即:没有 CAST(...).query(),使用 CTE 来处理转换:

;WITH cte AS (
  SELECT DocumentID, UserID, CAST(Content AS XML) AS XMLContent
  FROM Documents
)

SELECT XMLContent.query('/IDMSDocument/DocumentContent/Attribute[5]/Value/Value') 
FROM cte
WHERE XMLContent.value('(/IDMSDocument/DocumentContent/Attribute[5]/Value/Value)[1]', 'nvarchar(max)') like '%search%'

有一件事:我在 Content 列中看到了 Unicode(俄语?)字符。在您的 XML 中使用 utf-16 并为列类型使用 ntext 可能会更好。

textntext 也是 on the way out .如果这是新代码,请使用 nvarchar(max)

关于sql - 如何查询包含 XML(不是 xml 列类型)的 SQL Server TEXT 列中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26392066/

相关文章:

mysql - 在MYSQL中查找最大值,但是如果最大值驻留在两行中怎么办

mysql - 如何从 MySQL 中另一个 select 的结果中进行选择?

sql - 如何编写一个包含多个参数的存储过程查询?

mysql - 我是否必须使用 OpenQuery 从 SQL Server 查询 MySQL 链接服务器?

java - 扩展类时膨胀错误

sql - PostgreSQL 按时间戳过滤

php - 对表的sql条件查询

sql-server - 如何查看旧的 Sybase sql (.db) 数据库数据并转换为 Sql Server

c++ - 没有托管代码的 xml 序列化?

java - OnCreateOptions 被调用,但 OnOptionsItemSelected 未被调用