Sql server SQL Server 2008管理控制台:自动将结果写入脚本并执行它

Sql server SQL Server 2008管理控制台:自动将结果写入脚本并执行它,sql-server,sql-server-2008,sql-server-2008-r2,ssms,Sql Server,Sql Server 2008,Sql Server 2008 R2,Ssms,我想写一个脚本,从数据库中生成各种语句 比如: select 'DROP TABLE ['+ name + ']' from sys.objects where type = 'T' ; 我想在一个新文件中自动收集这些语句的所有输出,然后执行这个文件。这可能吗 重要提示:输出当然应该没有标题,没有任何其他错误/成功、消息等 在最佳情况下,所有必要的选项都应该在脚本本身中设置,而不是在用户界面中设置它们。您想要这样的东西吗 如果只想打印脚本,请使用osql和类似的脚本 DECLARE @sche

我想写一个脚本,从数据库中生成各种语句

比如:

select 'DROP TABLE ['+ name + ']' from sys.objects where type = 'T' ;
我想在一个新文件中自动收集这些语句的所有输出,然后执行这个文件。这可能吗

重要提示:输出当然应该没有标题,没有任何其他错误/成功、消息等


在最佳情况下,所有必要的选项都应该在脚本本身中设置,而不是在用户界面中设置它们。

您想要这样的东西吗

如果只想打印脚本,请使用
osql
和类似的脚本

DECLARE @schema VARCHAR(255)
DECLARE @table VARCHAR(255)

DECLARE PrintOutputCursor CURSOR LOCAL FAST_FORWARD FOR
    SELECT [TABLE_SCHEMA], [TABLE_NAME]
    FROM INFORMATION_SCHEMA.TABLES
OPEN PrintOutputCursor
FETCH NEXT FROM PrintOutputCursor INTO @schema, @table
WHILE @@FETCH_STATUS = 0 BEGIN
    PRINT 'DROP TABLE ['+ @schema + '].[' + @table + '];'
    FETCH NEXT FROM PrintOutputCursor INTO @schema, @table
END
CLOSE PrintOutputCursor
DEALLOCATE PrintOutputCursor
如果要使用
osql执行脚本,请使用此脚本(不推荐)


你想要这样的东西吗

如果只想打印脚本,请使用
osql
和类似的脚本

DECLARE @schema VARCHAR(255)
DECLARE @table VARCHAR(255)

DECLARE PrintOutputCursor CURSOR LOCAL FAST_FORWARD FOR
    SELECT [TABLE_SCHEMA], [TABLE_NAME]
    FROM INFORMATION_SCHEMA.TABLES
OPEN PrintOutputCursor
FETCH NEXT FROM PrintOutputCursor INTO @schema, @table
WHILE @@FETCH_STATUS = 0 BEGIN
    PRINT 'DROP TABLE ['+ @schema + '].[' + @table + '];'
    FETCH NEXT FROM PrintOutputCursor INTO @schema, @table
END
CLOSE PrintOutputCursor
DEALLOCATE PrintOutputCursor
如果要使用
osql执行脚本,请使用此脚本(不推荐)


首先,创建动态脚本,类似于

DECLARE @sql NVARCHAR(MAX)  
SELECT @sql = 
     COALESCE(@sql + CHAR(13), '') + 
     'DROP TABLE ['+ name + ']' 
FROM sys.objects 
WHERE [type] = 'T'
执行

EXEC(@sql)
然后将其打印到消息窗口

PRINT @sql
最后,进入“消息”窗口,右键单击它,选择“结果另存为…”,另存为类型>所有文件,然后像myfile.sql一样写入文件名

编辑


我永远不会,永远不会在没有事务的情况下自动执行这样的事情。我宁愿从消息窗口保存一个脚本,打开它,检查它,然后执行。

首先,创建动态脚本,类似于

DECLARE @sql NVARCHAR(MAX)  
SELECT @sql = 
     COALESCE(@sql + CHAR(13), '') + 
     'DROP TABLE ['+ name + ']' 
FROM sys.objects 
WHERE [type] = 'T'
执行

EXEC(@sql)
然后将其打印到消息窗口

PRINT @sql
最后,进入“消息”窗口,右键单击它,选择“结果另存为…”,另存为类型>所有文件,然后像myfile.sql一样写入文件名

编辑


我永远不会,永远不会在没有事务的情况下自动执行这样的事情。我宁愿从消息窗口保存一个脚本,打开它,检查它,然后执行。

Hm看起来很不错,但是可以在那里输入文件名吗?另外,是否可以在编写脚本后立即执行脚本?Hm看起来很不错,但是否可以在那里输入文件名?此外,是否可以在编写脚本之后立即执行脚本?您应该使用
sys.tables
,这样就不需要任何
类型=…
说明符。顺便说一句:
type='T'
是错误的-它应该是
type='U'
U
,如
user table
)-但正如我所提到的-如果您使用
从sys.tables
选择名称,那么您不需要记住那些棘手的细节…执行动态脚本然后将其保存到文件有什么错?这可以通过将所有内容收集到变量中,将该变量打印到SSMS消息窗口,使用exec执行该变量,最后保存消息中的输出脚本来实现。您好,您能帮我举个例子吗?也许这对你来说是“简单的”,但对我来说不是:-)。为了澄清我现在做的事情:在菜单中,我选择“查询结果到文件”。然后启动脚本,我需要输入一个文件名。脚本完成后,我打开文件,手动删除“----”和“17行”,然后执行新脚本。我想进一步实现自动化,即不需要输入文件名,也不需要手动清理。您应该使用
sys.tables
,这样您就不需要任何
类型=…
说明符。顺便说一句:
type='T'
是错误的-它应该是
type='U'
U
,如
user table
)-但正如我所提到的-如果您使用
从sys.tables
选择名称,那么您不需要记住那些棘手的细节…执行动态脚本然后将其保存到文件有什么错?这可以通过将所有内容收集到变量中,将该变量打印到SSMS消息窗口,使用exec执行该变量,最后保存消息中的输出脚本来实现。您好,您能帮我举个例子吗?也许这对你来说是“简单的”,但对我来说不是:-)。为了澄清我现在做的事情:在菜单中,我选择“查询结果到文件”。然后启动脚本,我需要输入一个文件名。脚本完成后,我打开文件,手动删除“----”和“17行”,然后执行新脚本。我想进一步实现自动化,即无需输入文件名,无需手动清理。非常感谢,现在更好地理解这一点。实际上,“EXEC”部分执行生成的DROP语句,因此这非常危险。我希望先将语句打印到文件中,然后执行此文件。但是,PRINT命令是否可以在脚本中的某个位置设置文件名,而不是手动保存文件?据我所知,这是不可能的。也许使用了一些SQLCMD模式的黑客,但我不太喜欢它。不过你可以试试这个:非常感谢,现在更好地理解这个。实际上,“EXEC”部分执行生成的DROP语句,因此这非常危险。我希望先将语句打印到文件中,然后执行此文件。但是,PRINT命令是否可以在脚本中的某个位置设置文件名,而不是手动保存文件?据我所知,这是不可能的。也许使用了一些SQLCMD模式的黑客,但我不太喜欢它。您可以尝试以下方法: