执行查询的输出

use*_*354 6 sql-server

我有这个查询来构建我的 drop login 语句。作为第二部分,我想执行这个输出。理想情况下,我想通过两个步骤(生成和执行)在 sql 作业中执行此操作。这能做到吗?

SELECT 'DROP LOGIN [' + name + ']'
FROM [master].[dbo].[syslogins]
WHERE isntgroup = 0
  AND isntuser = 0
  AND sysadmin = 0
  AND name != 'sa'
  AND name NOT LIKE '##%'
ORDER BY name
Run Code Online (Sandbox Code Playgroud)

Tho*_*ger 6

您可以做的是将查询的输出设置为连接字符串变量。类似于以下内容:

declare @sql_command varchar(max);
set @sql_command = '';

SELECT @sql_command += 'DROP LOGIN [' + name + ']' + char(13)
FROM [master].[dbo].[syslogins]
WHERE isntgroup = 0
  AND isntuser = 0
  AND sysadmin = 0
  AND name != 'sa'
  AND name NOT LIKE '##%'
ORDER BY name

print @sql_command;
-- exec (@sql_command);
Run Code Online (Sandbox Code Playgroud)

PRINT会告诉你你的命令,我已经注释掉EXEC但会运行生成的SQL。请注意,您必须取消EXEC对实际发生的任何事情的注释(事先要小心,并确保这是您正在寻找的行为)。

至于生成的一个步骤和执行的另一个步骤,我不太确定这样做会带来什么。听起来您并没有给自己时间在执行之前“审查” drop 语句。但是,无论哪种方式,您都可以在一个步骤中将语句存储在表中,然后DROP LOGIN如果您愿意的话,可以在后续步骤中执行最近生成的命令。那将是满足该要求的一种方式。

我意识到您可能需要执行上述任务,但请注意,您要求创建 SQL Server 代理作业来执行一些不那么常规的操作,例如删除服务器主体。这可能需要了解为什么实际上有要求,并在需要重复发生的基础上快速删除登录的情况下进行处理。再次,只是需要考虑的事情。