【问题标题】:SQL Server 2008 Management Console: Automatically write results to a script and execute itSQL Server 2008 管理控制台:自动将结果写入脚本并执行
【发布时间】:2013-06-20 10:45:10
【问题描述】:

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

类似:

select 'DROP TABLE ['+ name + ']' from sys.objects where type = 'T' ;

我想自动将这些语句的所有输出收集到一个新文件中,然后我想执行这个文件。这可能吗?

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

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

【问题讨论】:

  • 您应该改用sys.tables - 这样您就不需要任何type = ... 说明符。顺便说一句:type = 'T' 是错误的 - 应该是 type = 'U'Uuser table) - 但正如我所提到的 - 如果你使用select name from sys.tables,那么你不需要记住那些棘手的细节。 ..
  • 执行动态脚本然后保存到文件有什么问题?这可以通过将所有内容收集到变量、将该变量打印到 SSMS 消息窗口、使用 exec 执行该变量并最终保存消息中的输出脚本来简单地实现。
  • 您好,请问可以举个例子吗?可能对你来说“只是”,但对我来说不是:-)。澄清我现在做什么:在菜单中,我选择“查询结果到文件”。然后我启动脚本,我需要输入一个文件名。脚本完成后,我打开文件,手动删除“-----”和“17 行”之类的行,然后执行新脚本。我想进一步自动化,即不需要输入文件名,也不需要手动清理。

标签: sql-server sql-server-2008 sql-server-2008-r2 ssms


【解决方案1】:

首先,您创建动态脚本,例如...

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

编辑

我永远不会,在没有交易的情况下自动执行这样的事情。我宁愿从 Messages-window 中保存一个脚本,打开它,查看它然后执行。

【讨论】:

【解决方案2】:

你想要这样的东西吗?

如果您只想打印脚本,请使用 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 @schema VARCHAR(255)
DECLARE @table VARCHAR(255)
DECLARE @exec VARCHAR(4000)

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
    SET @exec = 'DROP TABLE ['+ @schema + '].[' + @table + '];'
    -- Uncomment the following to execute the dynamic statement
    -- EXEC (@exec)
    FETCH NEXT FROM PrintOutputCursor INTO @schema, @table
END
CLOSE PrintOutputCursor
DEALLOCATE PrintOutputCursor

【讨论】:

  • 嗯看起来不错,但是可以在那里输入文件名吗?另外,是否可以在脚本编写后立即执行?
猜你喜欢
  • 1970-01-01
  • 2010-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-04
  • 2019-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多