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。
我想知道为什么以下内容不起作用:
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。