Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用SQL Server从复杂的XML结构中读取值_Sql_Sql Server_Xml_Tsql_Xml Parsing - Fatal编程技术网

使用SQL Server从复杂的XML结构中读取值

使用SQL Server从复杂的XML结构中读取值,sql,sql-server,xml,tsql,xml-parsing,Sql,Sql Server,Xml,Tsql,Xml Parsing,我试图从数据类型为ntext的列中从XML结构中读取SQL Server查询中的值 这是我想从中提取值来读取的XML结构: <PrinterProcessDef xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://dev.docuware.com/settings/workflow/processdef" Id="3e

我试图从数据类型为
ntext
的列中从XML结构中读取SQL Server查询中的值

这是我想从中提取
值来读取的XML结构

<PrinterProcessDef xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://dev.docuware.com/settings/workflow/processdef" Id="3e62848d-040e-4f4c-a893-ed85a7b2878a" Type="PrinterProcess" ConfigId="c43792ed-1934-454b-a40f-5f4dfec933b0" Enabled="true" PCId="2837f136-028d-47ed-abdc-4103bedce1d2" Timestamp="2016-08-08T09:44:38.532415">
  <Configs>
    <Config xmlns:q1="http://dev.docuware.com/settings/workflow/processconfig" xsi:type="q1:PrinterProcessConfig" Id="c43792ed-1934-454b-a40f-5f4dfec933b0" />
    <Config xmlns:q2="http://dev.docuware.com/settings/workflow/processconfig" xsi:type="q2:RecognizeActConfig" Id="b89a6fc2-5573-4034-978a-752c6c0de4cf">
      <q2:Header DefaultRecognitionTechnology="OCR" DefaultOCRSettingsGuid="00000000-0000-0000-0000-000000000000">
      </q2:Header>
      <q2:Body>
        <q2:AnchorDefs />
        <q2:ZoneDefs />
        <q2:TableDefs />
        <q2:FaceLayouts>
        </q2:FaceLayouts>
        <q2:FaceSamples>
        </q2:FaceSamples>
        <q2:SampleDocument>
          <MetaData xmlns="http://dev.docuware.com/settings/common" FileName="Test - Editor" MimeType="application/pdf" PageCount="1" SourceAppName="C:\Windows\system32\NOTEPAD.EXE" DocumentTitle="Test - Editor" PdfCreator="DocuWare Printer" />
          <Data xmlns="http://dev.docuware.com/settings/common">!!!VALUE TO READ!!!</Data>
        </q2:SampleDocument>
      </q2:Body>
      <q2:AllPagesRequired>false</q2:AllPagesRequired>
    </Config>
    <Config xmlns:q3="http://dev.docuware.com/settings/workflow/processconfig" xsi:type="q3:RecognizeActConfig" Id="db5b195d-79e4-4804-bd38-f4fc7e8d5a8d">
    </Config>
    <Config xmlns:q4="http://dev.docuware.com/settings/workflow/processconfig" xsi:type="q4:AddOverlayActConfig" Id="023aab08-c6e3-4f08-9d26-0175d1564ef2">
      <q4:Overlays />
    </Config>
    <Config xmlns:q5="http://dev.docuware.com/settings/workflow/processconfig" xsi:type="q5:PrintActConfig" Id="4a4ec06a-8652-4777-84d2-53cb862b3328">
    </Config>
    <Config xmlns:q6="http://dev.docuware.com/settings/workflow/processconfig" xsi:type="q6:SignActConfig" Id="8c030961-e68e-4c2f-83f1-cac20f51d4d6">
    </Config>
    <Config xmlns:q7="http://dev.docuware.com/settings/workflow/processconfig" xsi:type="q7:EmailActConfig" Id="5dbd144b-5c33-407a-b638-e062f9045fb4">
    </Config>
    <Config xmlns:q8="http://dev.docuware.com/settings/workflow/processconfig" xsi:type="q8:IndexActConfig" Id="f2a70e07-d76e-4e82-9313-7c665df4c311">
    </Config>
    <Config xmlns:q10="http://dev.docuware.com/settings/workflow/processconfig" xsi:type="q10:StoreActConfig" Id="ff8aec66-608e-4dde-a4b6-de65ada39bb0">
    </Config>
    <Config xmlns:q11="http://dev.docuware.com/settings/workflow/processconfig" xsi:type="q11:NotifyUserActConfig" Id="7ffb0437-6b8c-4f5f-8f40-434f4a6d609a" />
  </Configs>
  <Activities>
  </Activities>
</PrinterProcessDef>
我得到的所有返回值都是NULL,不希望读取

我应该怎么做才能使查询正常工作


我还尝试了没有名称空间声明的不同版本和其他版本,但我总是得到空值。

所有元素都定义了名称空间。您需要根据定义声明和指定它们

SELECT CAST([Table].[settings] as xml).value(
   'declare namespace top="http://dev.docuware.com/settings/workflow/processdef";
    declare namespace q2="http://dev.docuware.com/settings/workflow/processconfig";
    declare namespace nd="http://dev.docuware.com/settings/common";
    (/top:PrinterProcessDef/top:Configs/top:Config[@xsi:type="q2:RecognizeActConfig"]/q2:Body/q2:SampleDocument/nd:Data)[1]',  
        'varchar(max)')
FROM [DB].[dbo].[Table]

您忘记了使用xmlns属性声明的名称空间。请看以下示例:

DECLARE @xml xml = 'yourXml'

SELECT @xml.value('
declare namespace q2="http://dev.docuware.com/settings/workflow/processconfig";
declare namespace g="http://dev.docuware.com/settings/workflow/processdef";
declare namespace qd="http://dev.docuware.com/settings/common";
(//g:PrinterProcessDef/g:Configs/g:Config[@xsi:type="q2:RecognizeActConfig"]/q2:Body/q2:SampleDocument/qd:Data/text())[1]',
    'varchar(max)')

不管这个XML是如何生成的,名称空间都非常奇怪。。。您多次声明相同的名称空间。。。如果我没有弄错的话,名称空间并不是它应该的样子,因此我会忽略它们:

SELECT 
    CAST([Table].[settings] as xml as xml)
        .value('(/*:PrinterProcessDef/*:Configs/*:Config[@*:type="q2:RecognizeActConfig"]/*:Body/*:SampleDocument/*:Data/text())[1]',
        'varchar(max)')
FROM 
    [DB].[dbo].[Table]
无论如何,我建议您使用XMLNAMESPACE在
中声明名称空间,而不是在
.value
-函数中声明名称空间。如果需要从中提取多个值,则可以创建更好的阅读查询:

WITH XMLNAMESPACES(DEFAULT 'http://dev.docuware.com/settings/workflow/processdef'
                  ,'http://dev.docuware.com/settings/workflow/processconfig' AS q2
                  ,'http://dev.docuware.com/settings/common' AS nd)
SELECT 
    CAST([Table].[settings] as xml)
        .value('(/PrinterProcessDef/Configs/Config[@xsi:type="q2:RecognizeActConfig"]/q2:Body/q2:SampleDocument/nd:Data)[1]',
        'varchar(max)')

顺便说一句:在其他答案中,使用
DEFAULT
避免使用类似
top:
的虚拟名称空间…

ntext
text
image
数据类型将在SQL Server的未来版本中删除。避免在新的开发工作中使用这些数据类型,并计划修改当前使用它们的应用程序。改用
nvarchar(max)
varchar(max)
,和
varbinary(max)
。-或者,在本例中,如果您正在存储XML,则使用
XML
数据类型!这就是它的目的!对于本例中给出的奇怪名称空间,我建议完全避免(屏蔽)它们…对于本例中给出的奇怪名称空间,我建议完全避免(屏蔽)它们。。。
WITH XMLNAMESPACES(DEFAULT 'http://dev.docuware.com/settings/workflow/processdef'
                  ,'http://dev.docuware.com/settings/workflow/processconfig' AS q2
                  ,'http://dev.docuware.com/settings/common' AS nd)
SELECT 
    CAST([Table].[settings] as xml)
        .value('(/PrinterProcessDef/Configs/Config[@xsi:type="q2:RecognizeActConfig"]/q2:Body/q2:SampleDocument/nd:Data)[1]',
        'varchar(max)')