0

再会

我有一个查询来查看和排序我的 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 时,它不起作用。

谢谢。

4

1 回答 1

0

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

--the file's name
DECLARE @filename VARCHAR(250)='menuCat_756.xml';

--a tolerant staging table to help us get the result of EXEC
DECLARE @staging TABLE(TheXml NVARCHAR(MAX));

--a dynamically created command
DECLARE @cmd NVARCHAR(MAX)=
N'select c1
  from OPENROWSET (BULK ''C:\ISP\bin\EN\XML\Cataloghi\' + @filename + ''',SINGLE_CLOB) as T1(c1)';

--This will shift the "result set" (which is one single XML) into our staging table
INSERT INTO @staging 
EXEC(@cmd);

--Test it
SELECT * FROM @staging

提示1:SINLGE_BLOB改为SINLGE_CLOB

提示 2:在将结果用作 XML 之前,必须将结果转换为 XML。导入后
进行强制转换是一种很好的做法,以避免几乎找不到的错误......

于 2018-05-08T07:36:04.780 回答