当前位置: 首页 > 面试题库 >

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

干亮
2023-03-14
问题内容

我有表DOCUMENTS,其中:

DOCUMENTS
____________________
DOCUMENTID   int
USERID       int
CONTENT      text

我在SQL Server数据库中以名称CONTENT将以下XML存储在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>

我找到一种方法,可以通过大量转换从表中查询单行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中第五个属性中具有值’search’的表中的所有行”

对我来说,一般的问题是列类型不是XML,但是我的text列中有存储的xml。当我尝试强制转换,查询,直接向服务器返回值时,我只能将其与XML列一起使用。

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

谢谢!

假面


问题答案:

SQL Server不允许内联XML转换应用函数,即:no 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(俄语)字符。最好utf-16在XML和ntext列类型中使用。

text而且ntext还在出路。如果这是新代码,请使用nvarchar(max)



 类似资料:
  • 问题内容: 我有一个数据框,其中包含有关电影的信息。它有一个名为的列,其中包含它所属的流派列表。例如: 我想知道如何查询数据框,以便它返回属于某个类型的电影? 例如,可能会返回0或1。 我知道列表,可以做以下事情: 但是,在大熊猫中,我找不到类似的东西,我唯一知道的是,但它不适用于列表类型。 问题答案: 您可以使用create ,然后:

  • 我正在编写一个用于日志记录的自定义spring boot starter项目。我的logback-spring.xml变得很大,希望将附加符放入单独的文件(console-appender.xml和file-appender.xml)中,并希望包含在logback-spring.xml文件中,如下所示。我将所有三个XML放在自定义starter项目的src/main/resources文件夹中。

  • 我有一个项目,关于从URL获取XML文件,将其删除,提取数据,然后进行处理。此外,我正在使用用户输入创建URL。但是我需要检查URL是否包含要刮取的XML文件。有什么办法吗?那么基本上如何检查URL是否包含XML文件呢?

  • 问题内容: MS SQL提供了一种方便的解决方法,可将多行中的列值连接为一个值: 并返回一个不错的记录集: 仅返回的记录集中的列名非常讨厌! 列名似乎包含随机元素(或GUID),因此我不愿意在我的应用程序中使用它(不同的实例或不同的服务器可能具有另一个GUID)。不幸的是,我无法使用*来选择值,并且由于现有应用程序中的限制,我也无法遍历返回的列… 有没有一种方法可以将返回的记录集中的列名强制为更明

  • 问题内容: 我想创建一个XML文件,该文件将用于存储Java程序的结构。我能够成功解析Java程序并根据需要创建标签。当我尝试,包括我的标签中的源代码,就会出现问题,因为Java源代码可以使用的实体引用广大和保留的字符,如,,,。我无法创建有效的XML。 我的XML应该像这样: 这样,但是问题是条件表达式或其他语句中有很多或其他保留的符号,这妨碍了XML的验证。由于所有这些数据(源代码)都是由用户

  • 我谷歌了很多,但运气不好。我不能从XML列中检索数据,这些数据来自使用sp_OAGetProperty的Web服务。 XML列包含。。 当我执行下面的语句时,我得到了NULL (但如果我删除所有XML名称空间xmlns:xsi=”就可以了http://www.w3.org/2001/XMLSchema-instance“xmlns:xsd=”http://www.w3.org/2001/XMLSc