SQL 中的字符串连接不起作用

String concatenation in SQL doesn't work

我想知道为什么以下内容不起作用:

INSERT INTO @Data2 (FileName,Field) 
SELECT @FileName as FileName, * FROM OPENROWSET(BULK  '\serverpath\' + @FileName  , SINGLE_CLOB) AS Contents

我也尝试了第二种方法,但使用这种方法时,我收到错误消息,指出变量未声明:

declare @path nvarchar(255) = 'SELECT @FileName as FileName, * FROM OPENROWSET(BULK ''\serverpath\' + @FileName + ''', SINGLE_CLOB) AS Contents'

INSERT INTO @Data2 (FileName,Field)
EXEC(@path)

有人可以帮忙吗? 谢谢

您不能使用 exec 传递 @FileName as FileName,但可以使用 sp_executesql -- 但您仍然不能将 @FileName 作为 [=16= 的一部分传递]:

declare @path nvarchar(4000) = N'
  select @FileName as FileName, * 
  from openrowset(bulk ''\serverpath\' + @FileName + '''
    , single_clob) as Contents'

insert into @Data2 (FileName,Field)
exec sp_executesql, N'@FileName nvarchar(1024))',@FileName

或者像 bulk 来源一样直接连接它:

declare @path nvarchar(4000) = N'
  select '+quotename(@FileName,'''')+' as FileName, * 
  from openrowset(bulk '+quotename('\serverpath\'+@FileName,'''')+'
    , single_clob) as Contents'

insert into @Data2 (FileName,Field)
exec sp_executesql @path

参考:

您不能将 OPENROWSET 与可变路径一起使用。检查这个:

--有效

DECLARE @Data2 TABLE(Field VARBINARY(MAX));
INSERT INTO @Data2 (Field) 
SELECT * FROM OPENROWSET(BULK  'F:\Privat\Whosebug\test.xml'  , SINGLE_BLOB) AS Contents;
SELECT CAST(Field AS NVARCHAR(MAX)) FROM @Data2;

--语法检查中断

DECLARE @FileName AS VARCHAR(1000)='F:\Privat\Whosebug\test.xml';
INSERT INTO @Data2 (Field) 
SELECT * FROM OPENROWSET(BULK  @FileName  , SINGLE_BLOB) AS Contents;
SELECT CAST(Field AS NVARCHAR(MAX)) FROM @Data2;

-- 这可行,但需要物理创建 table。您的 table 变量超出了 EXEC-execution

的范围
CREATE TABLE Data2(Field VARBINARY(MAX));
DECLARE @FileName AS VARCHAR(1000)='F:\Privat\Whosebug\test.xml';
DECLARE @cmd VARCHAR(MAX)='INSERT INTO Data2(Field) SELECT * FROM OPENROWSET(BULK ''' +  @FileName + ''', SINGLE_BLOB) AS Contents;'
EXEC(@cmd);
SELECT * FROM Data2;
GO
DROP TABLE Data2;

您可以使用输出参数而不是物理创建的 table。