1

我使用以下代码,一切正常

DECLARE @Directory varchar(100)
SELECT @Directory = 'c:\XML\'

DECLARE @FileExist int
DECLARE @FileName varchar(500),@DeleteCommand varchar(1000),@FullFileName varchar(500), @SQLFullFileName varchar(500)


DECLARE @X XML
SELECT @X = CONVERT(xml,[ICECAT-interface],2)
FROM OPENROWSET(BULK 'C:\XML\1382.xml',SINGLE_BLOB) AS Import([ICECAT-interface])

select P1.X.value('@ID', 'int') as ProductID,
       P2.X.value('@ID', 'int') as ProductID


 from @X.nodes('/ICECAT-interface/Product') as P1(X)
 cross apply P1.X.nodes('ProductRelated') as PR(X)
 cross apply PR.X.nodes('Product') as P2(X)

如果我将此行替换为 C:\XML\1382.xml 中的文件名

 SELECT @X = CONVERT(xml,[ICECAT-interface],2) 
 FROM OPENROWSET(BULK ' + @FullFileName + ' ,SINGLE_BLOB) AS Import([ICECAT-interface])

它错误地说该文件不存在,但在调试模式下我可以看到变量@FullFileName 存在并且是正确的。

任何输入将不胜感激。

谢谢

约翰

4

1 回答 1

3

您不能将变量传递给,OPENROWSET()因此您需要使用动态 SQL。这是未经测试的,但应该给你一个想法:

DECLARE @x XML, @sql NVARCHAR(MAX);

SELECT @sql = N'SELECT @X = CONVERT(xml,[ICECAT-interface],2) 
 FROM OPENROWSET(BULK ''' + @FullFileName + ''' ,SINGLE_BLOB)
 ---------------------^^ escaped quotes are important 
 AS Import([ICECAT-interface]);';

EXEC sp_executesql @sql, N'@x XML OUTPUT', @x OUTPUT;

SELECT @x;
于 2013-04-15T18:01:54.463 回答