Sql server XML解析视图

Sql server XML解析视图,sql-server,xml,tsql,dynamic-sql,xml-import,Sql Server,Xml,Tsql,Dynamic Sql,Xml Import,你好 我有一个查询,可以查看和排序SQL的内容。如果您知道xml文件是什么,这很容易,但是我尝试创建xml文件作为参数,因为它并不总是相同的。如何将参数添加到路径?我试过了,但它说不正确 以下是视图中的代码: select c3.value('@CtlgID','nvarchar(50)') AS 'ID', c4.value('@label','nvarchar(50)') AS 'ID', c5.value('@label','nvarc

你好

我有一个查询,可以查看和排序SQL的内容。如果您知道xml文件是什么,这很容易,但是我尝试创建xml文件作为参数,因为它并不总是相同的。如何将参数添加到路径?我试过了,但它说不正确

以下是视图中的代码:

   select
        c3.value('@CtlgID','nvarchar(50)') AS 'ID',
        c4.value('@label','nvarchar(50)') AS 'ID',
        c5.value('@label','nvarchar(50)') AS 'ID'
    from
    (
       select 
          cast(c1 as xml)
       from 
          OPENROWSET (BULK 'C:\ISP\bin\EN\XML\Cataloghi\menuCat_756.xml',SINGLE_BLOB) as T1(c1)

    )as T2(c2)
    cross apply c2.nodes('/node') T3(c3)
    cross apply c2.nodes('/node/node') T4(c4)
    cross apply c2.nodes('/node/node/node') T5(c5)
我正在尝试将其添加到存储过程中:

PROCEDURE [dbo].[Update_ISP_Child] 
    -- Add the parameters for the stored procedure here
    @p1 nvarchar(50) = 'menuCat_756.xml'
AS
BEGIN

    select
    c3.value('@CtlgID','nvarchar(50)') AS 'ID',
    c4.value('@label','nvarchar(50)') AS 'ID',
    c5.value('@label','nvarchar(50)') AS 'ID'
from
(
   select 
      cast(c1 as xml)
   from 
      OPENROWSET (BULK 'C:\ISP\bin\EN\XML\Cataloghi\' + @p1,SINGLE_BLOB) as T1(c1)

)as T2(c2)
cross apply c2.nodes('/node') T3(c3)
cross apply c2.nodes('/node/node') T4(c4)
cross apply c2.nodes('/node/node/node') T5(c5)

END
当我将参数添加为@p1时,它不起作用

谢谢


您必须动态构建整个语句:

——文件名
声明@filename VARCHAR(250)='menuCat_756.xml';
--用于帮助我们获得EXEC结果的容错暂存表
声明@staging TABLE(thexmlnvarchar(MAX));
--动态创建的命令
声明@cmd NVARCHAR(最大值)=
选择c1
从OPENROWSET(大容量“C:\ISP\bin\EN\XML\Cataloghi\'+@filename++'',单个\u CLOB)作为T1(c1)';
--这将把“结果集”(一个XML)转移到我们的暂存表中
插入@staging
EXEC(@cmd);
--测试一下
从@staging中选择*
提示1:我将
SINLGE\u BLOB
更改为
SINLGE\u CLOB

提示2:在将结果转换为XML之前,必须将其转换为XML。

在导入后执行强制转换是一种很好的做法,以避免很难找到错误。

为此,您可能需要使用动态sql。网上有很多例子。我知道,但这就是问题所在,它不想接受这个命令中的参数:OPENROWSET(BULK'C:\ISP\bin\EN\XML\Cataloghi\'+@p1,SINGLE_BLOB)嗨,我已经尝试了所有方法,但都不起作用。当时我想到了一个不同的解决方案。我可以不引用该文件夹吗?文件夹中的所有XML文件都具有完全相同的结构。我确实尝试过:
code OPENROWSET(BULK'C:\ISP\bin\EN\XML\Cataloghi\*.XML',单块)
,但不起作用。谢谢