如何执行每一行而不将复制粘贴到另一个窗口

时间:2018-03-23 09:35:56

标签: sql sql-server

这是我的第一篇文章,我一直试图创建一个可以在一次运行中执行所有操作的脚本,但无济于事,也许有人可以提供帮助

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'

我尝试将结果放在临时表中,但在检索每一行并执行它们时遇到了问题。

2 个答案:

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