如何从具有需要在同一服务器上的多个DB上执行的SQL脚本的文件中读取

时间:2016-06-03 17:12:20

标签: sql-server tsql

下面的脚本假设要在多个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脚本中的内容。将会感谢任何帮助。

1 个答案:

答案 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