Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.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值创建where条件_Sql Server_Xml_Xquery - Fatal编程技术网

Sql server 使用多个名称空间从XML值创建where条件

Sql server 使用多个名称空间从XML值创建where条件,sql-server,xml,xquery,Sql Server,Xml,Xquery,我希望从XML返回where条件的值。 我想从messages表的Request列返回一个值。它采用XML数据格式。不幸的是,我所能做的就是什么也找不到。 然后我尝试将该值作为一列,但我总是得到值为null的值 以下是来自请求列的XML: <InvoiceRequest xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/InternalReuq

我希望从XML返回where条件的值。 我想从messages表的Request返回一个值。它采用XML数据格式。不幸的是,我所能做的就是什么也找不到。 然后我尝试将该值作为一列,但我总是得到值为null的值

以下是来自请求列的XML:

<InvoiceRequest xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/InternalReuqests">
  <ActiveUserID xmlns="http://schemas.datacontract.org/2004/07/Fix.ServiceBase">0</ActiveUserID>
  <LinqConfigId xmlns="http://schemas.datacontract.org/2004/07/Fix.ServiceBase">0</LinqConfigId>
  <RequestHeaderInfo xmlns:d2p1="Fix.Services" xmlns="http://schemas.datacontract.org/2004/07/Fix.ServiceBase">
    <d2p1:MapArchive i:nil="true" />
    <d2p1:HandledSuccessCategory>rscNone</d2p1:HandledSuccessCategory>
  </RequestHeaderInfo>
  <Username xmlns="http://schemas.datacontract.org/2004/07/Fix.ServiceBase" i:nil="true" />
  <SSID>S-1-6-25-123456789-123456789-123456789-12345</SSID>
  <miscdata xmlns:d2p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
    <d2p1:string>date:2020.02.26 08:27:00</d2p1:string>
    <d2p1:string>hours:0</d2p1:string>
    <d2p1:string>Ready:True</d2p1:string>
    <d2p1:string>disct:False</d2p1:string>
    <d2p1:string>extdisct:False</d2p1:string>
    <d2p1:string>Matmove:False</d2p1:string>
    <d2p1:string>Matlim:0</d2p1:string>
    <d2p1:string>Comments:</d2p1:string>
  </miscdata>
  <ffreeID>468545</ffreeID>
</InvoiceRequest>
我想我应该在第一列中从数据库中获取id,然后在它旁边是ffreeID的值,但是Request.value总是空的


有人可以查看一下我缺少了什么吗?

您需要声明默认名称空间,您的xml名称空间是
http://schemas.datacontract.org/2004/07/InternalReuqests

——示例XML
声明@xml=
0
0
rscNone
S-1-6-25-123456789-123456789-123456789-123456789-12345
日期:2020.02.26 08:27:00
小时:0
准备好了吗
disct:错
extdisct:错误
马特莫夫:错
Matlim:0
评论:
468545
'; --假设这应该是,而不是。
--获得价值
使用XMLNAMESPACES(默认值'http://schemas.datacontract.org/2004/07/InternalReuqests')
选择X.Request.value('(/InvoiceRequest/ffreeID/text())[1],'int')
FROM(value(@XML))X(请求);

这里是模拟模拟表的另一种方法。其他一切都类似于@Larnu的解决方案。所有功劳都归于@Larnu

SQL


Larnu,我想澄清一下:您将xml放入一个变量中。我在消息表中每一行的请求列中都有这个xml数据。在这种情况下,如何声明变量?我用:
和XMLNAMESPACES(默认值)进行了尝试http://schemas.datacontract.org/2004/07/InternalReuqests“)从消息中选择id、Request.value(”(/InvoiceRequest/ffreeID/text())[1],“int”),但无法使其工作。仍然将null作为值“您将xml放入变量”我需要一种方法来测试这个过程,@user3420067;别忘了,我没有访问您的实例的权限。“仍然获取null作为值”这意味着您拥有的XML和您提供的XML不一样。这与我们的例子相反:Hi Larnu!很抱歉,根据Yitzhak的解释没有回复,这很有效,非常感谢您的帮助!非常感谢你的帮助,伊扎克!它确实有用!不幸的是,我无法使用拉努的解决方案,但这个解决方案有效。正如你所写,我会给拉努答案,但你的例子是我可以使用的。当心!
   select id, Request.value('(/*:InvoiceRequest/*:ffreeID)[1]','varchar(max)')
     from messages
-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, Request XML);
INSERT INTO @tbl (Request)
VALUES
(N'<InvoiceRequest xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
                xmlns="http://schemas.datacontract.org/2004/07/InternalReuqests">
    <ActiveUserID xmlns="http://schemas.datacontract.org/2004/07/Fix.ServiceBase">0</ActiveUserID>
    <LinqConfigId xmlns="http://schemas.datacontract.org/2004/07/Fix.ServiceBase">0</LinqConfigId>
    <RequestHeaderInfo xmlns:d2p1="Fix.Services"
                       xmlns="http://schemas.datacontract.org/2004/07/Fix.ServiceBase">
        <d2p1:MapArchive i:nil="true"/>
        <d2p1:HandledSuccessCategory>rscNone</d2p1:HandledSuccessCategory>
    </RequestHeaderInfo>
    <Username xmlns="http://schemas.datacontract.org/2004/07/Fix.ServiceBase" i:nil="true"/>
    <SSID>S-1-6-25-123456789-123456789-123456789-12345</SSID>
    <miscdata xmlns:d2p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
        <d2p1:string>date:2020.02.26 08:27:00</d2p1:string>
        <d2p1:string>hours:0</d2p1:string>
        <d2p1:string>Ready:True</d2p1:string>
        <d2p1:string>disct:False</d2p1:string>
        <d2p1:string>extdisct:False</d2p1:string>
        <d2p1:string>Matmove:False</d2p1:string>
        <d2p1:string>Matlim:0</d2p1:string>
        <d2p1:string>Comments:</d2p1:string>
    </miscdata>
    <ffreeID>468545</ffreeID>
</InvoiceRequest>');
-- DDL and sample data population, end

WITH XMLNAMESPACES(DEFAULT 'http://schemas.datacontract.org/2004/07/InternalReuqests')
SELECT ID
    , c.value('(ffreeID/text())[1]','INT') AS ffreeID
FROM @tbl AS tbl
    CROSS APPLY tbl.Request.nodes('/InvoiceRequest') AS t(c);
+----+---------+
| ID | ffreeID |
+----+---------+
|  1 |  468545 |
+----+---------+