这是我的第一篇文章,我一直试图创建一个可以在一次运行中执行所有操作的脚本,但无济于事,也许有人可以提供帮助
SET NOCOUNT ON;
DECLARE @user_name SYSNAME, @login_name SYSNAME;
SELECT @user_name = 'NT AUTHORITY\SYSTEM',@login_name = 'NT AUTHORITY\SYSTEM' SELECT 'USE ' + QUOTENAME(NAME) + ';
CREATE USER ' + QUOTENAME(@user_name) + ' FOR LOGIN ' + QUOTENAME(@login_name) + ' WITH DEFAULT_SCHEMA=[dbo];
EXEC sys.sp_addrolemember ''db_datareader'',''' + @user_name + '''; GO'
FROM sys.databases WHERE state_desc = 'ONLINE'
我尝试将结果放在临时表中,但在检索每一行并执行它们时遇到了问题。
答案 0 :(得分:0)
你可以创建一个游标,然后循环执行每个命令 例如:
set nocount on
declare @user_name SYSNAME, @login_name SYSNAME
declare @command1 varchar(4000)
declare @command2 varchar(4000)
select @user_name = 'NT AUTHORITY\SYSTEM', @login_name = 'NT AUTHORITY\SYSTEM'
declare crCommands cursor local FAST_FORWARD READ_ONLY for
select 'USE ' + QUOTENAME(NAME) + ' CREATE USER ' + QUOTENAME(@user_name) + ' FOR LOGIN ' + QUOTENAME(@login_name) + ' WITH DEFAULT_SCHEMA=[dbo]',
'EXEC sys.sp_addrolemember ''db_datareader'',''' + @user_name + ''''
from sys.databases
where state_desc = 'ONLINE'
open crCommands
fetch next from crCommands into @command1, @command2
while @@FETCH_STATUS = 0
begin
exec sp_executesql @command1
exec sp_executesql @command2
fetch next from crCommands into @command1, @command2
end
close crCommands
deallocate crCommands
这可能需要进行一些更改才能符合您的需要,但它应该可以让您顺利进行
答案 1 :(得分:-1)
尝试使用BEGIN END语句,如下所示: -
SET NOCOUNT ON;
DECLARE @user_name SYSNAME, @login_name SYSNAME;
SELECT @user_name = 'NT AUTHORITY\SYSTEM',@login_name = 'NT AUTHORITY\SYSTEM' SELECT 'USE ' + QUOTENAME(NAME) + ';
BEGIN CREATE USER ' + QUOTENAME(@user_name) + ' FOR LOGIN ' + QUOTENAME(@login_name) + ' WITH DEFAULT_SCHEMA=[dbo];
EXEC sys.sp_addrolemember ''db_datareader'',''' + @user_name + '''; END'
FROM sys.databases WHERE state_desc = 'ONLINE'