使用 openrowset / "Must declare the scalar variable" 问题循环遍历文件夹中的 XML
Looping through XMLs in folder using openrowset / "Must declare the scalar variable" Issue
本质上,我正在尝试使用 SQL 来查询文件夹中的 XML 个文件。查询 XML 的代码本身可以正常工作,但是一旦我将它变成一个字符串以允许 'openrowset' 中的表达式,它就会一直说抛出一条错误消息,说它找不到 @x 并且 'Must declare the scalar variable'。我知道还有 sp_executesql 但我真的不明白它是如何工作的以及为什么需要它。
提前致谢!
drop table #tmp
CREATE TABLE #tmp(files VARCHAR(100));
INSERT INTO #tmp
EXEC xp_cmdshell 'dir /B "C:\Users\USER\A\B"';
While (Select Count(*) From #tmp where files is not null) > 0
Begin
DECLARE @fileName varchar(max)
DECLARE @filepath varchar(max)
Declare @sql nvarchar(max)
Select Top 1 @fileName = files From #tmp
Set @filepath = 'C:\Users\USER0\A\B\' + @filename
DECLARE @n1 varchar(max)
DECLARE @n2 varchar(max)
Set @n1 = 'http://www.namespace1.com/file'
Set @n2 ='http://www.namespac2.com/XMLSchema'
SET @sql = '
DECLARE @x xml
@x = R
FROM Openrowset(Bulk ''' + @filepath + ''' , Single_Blob) AS ReturnData(R);
WITH XMLNAMESPACES(DEFAULT '''+@n1+'''
,'''+@n2+''' AS xsi)
INSERT INTO [dbo].[IRS]
([A]
,[B]
,[C]
)
Select
ct.value('''+'(../../Data/A/)[1]'+''','''+'varchar(max)'+''')
,ct.value('''+'(../../Data/B)[1]'+''','''+'varchar(max)'+''')
,ct.value('''+'(../../Data/C/)[1]'+''','''+'varchar(max)'+''')
FROM @x.nodes('''+'/Return/ReturnData/IRS990ScheduleH'+''') AS A(ct)
'
exec(@sql)
Delete from #tmp Where files = @FileName
End
我认为你的错误发生在这里:
DECLARE @x xml
@x = Something
要么使用
DECLARE @x XML=SomeXml;
or
DECLARE @x XML=(SELECT SomeXml FROM SomeWhere);
或
DECLARE @x xml;
然后
SET @x=SomeXml;
or
SET @x=(SELECT SomeXml FROM SomeWhere);
or
SELECT @x=SomeXml FROM SomeWhere;
本质上,我正在尝试使用 SQL 来查询文件夹中的 XML 个文件。查询 XML 的代码本身可以正常工作,但是一旦我将它变成一个字符串以允许 'openrowset' 中的表达式,它就会一直说抛出一条错误消息,说它找不到 @x 并且 'Must declare the scalar variable'。我知道还有 sp_executesql 但我真的不明白它是如何工作的以及为什么需要它。
提前致谢!
drop table #tmp
CREATE TABLE #tmp(files VARCHAR(100));
INSERT INTO #tmp
EXEC xp_cmdshell 'dir /B "C:\Users\USER\A\B"';
While (Select Count(*) From #tmp where files is not null) > 0
Begin
DECLARE @fileName varchar(max)
DECLARE @filepath varchar(max)
Declare @sql nvarchar(max)
Select Top 1 @fileName = files From #tmp
Set @filepath = 'C:\Users\USER0\A\B\' + @filename
DECLARE @n1 varchar(max)
DECLARE @n2 varchar(max)
Set @n1 = 'http://www.namespace1.com/file'
Set @n2 ='http://www.namespac2.com/XMLSchema'
SET @sql = '
DECLARE @x xml
@x = R
FROM Openrowset(Bulk ''' + @filepath + ''' , Single_Blob) AS ReturnData(R);
WITH XMLNAMESPACES(DEFAULT '''+@n1+'''
,'''+@n2+''' AS xsi)
INSERT INTO [dbo].[IRS]
([A]
,[B]
,[C]
)
Select
ct.value('''+'(../../Data/A/)[1]'+''','''+'varchar(max)'+''')
,ct.value('''+'(../../Data/B)[1]'+''','''+'varchar(max)'+''')
,ct.value('''+'(../../Data/C/)[1]'+''','''+'varchar(max)'+''')
FROM @x.nodes('''+'/Return/ReturnData/IRS990ScheduleH'+''') AS A(ct)
'
exec(@sql)
Delete from #tmp Where files = @FileName
End
我认为你的错误发生在这里:
DECLARE @x xml
@x = Something
要么使用
DECLARE @x XML=SomeXml;
or
DECLARE @x XML=(SELECT SomeXml FROM SomeWhere);
或
DECLARE @x xml;
然后
SET @x=SomeXml;
or
SET @x=(SELECT SomeXml FROM SomeWhere);
or
SELECT @x=SomeXml FROM SomeWhere;