下面的脚本假设要在多个DB上执行,但是在解析时会出现以下错误 -
Msg 102,Level 15,State 1,Line 40 “+”附近的语法不正确。
declare @list table (name varchar(128) not null);
fill the list with your custom subset
insert into @list
select name from sys.databases where name like '%connect%';
--select * from @list
--select min(name) from @list
--read the script
declare
@DBServerName varchar(128),
@FilePathName varchar(128),
@DBName varchar(128)
;
set @DBServerName = 'peeyushp-w8';
set @FilePathName = 'D:\script.sql';
set @DBName = '';
--EXEC xp_cmdshell 'sqlcmd -S ' + @DBServerName + ' -d ' + @DBName + ' -i ' + @FilePathName
declare
@db varchar(128),
@t varchar(max),
@s varchar(max)
;
--set @t = 'use {db}; exec sp_spaceused';
set @db = (select min(name) from @list);
while @db is not null
begin
--set @s = replace(@t, '{db}', ' -d' + @db);
--exec (@s);
EXEC xp_cmdshell 'sqlcmd -S ' + @DBServerName + @s + ' -i ' + replace(@FilePathName, '{db}', ' -d' + @db);
set @db = (select min(name) from @list where name > @db);
end
GO
错误发生在'xp_cmdshell'exec语句中。我错过了要包含在我的SQL脚本中的内容。将会感谢任何帮助。
答案 0 :(得分:1)
根据T-SQL中的PROCEDURE's Limitations and Restrictions:
您不能将函数名称指定为参数默认值,也不能指定在执行过程时传递给参数的值。但是,您可以将函数作为变量传递,如以下示例所示。
因此,不可能直接使用字符串连接作为过程参数。它必须在之前声明:
DECLARE @cmd VARCHAR(400)
SET @cmd = 'sqlcmd -S ' + @DBServerName + ' -d ' + @DBName + ' -i ' + @FilePathName
-- Now you can use it
EXEC xp_cmdshell @cmd