【发布时间】:2013-03-10 23:53:14
【问题描述】:
我正在尝试从每台服务器中删除表。我的服务器 1 有 3 个数据库,服务器 2 有 6 个,服务器 3 有 8 个。
以下是我编写的 SQL 脚本,用于从特定服务器中的每个数据库执行删除操作。在我执行这些操作之后。
DECLARE
@LoopId int,
@Command varchar(500),
@tblName varchar(100)
DECLARE @List TABLE
(
TableName sysname not null,
LoopId int not null identity(1,1)
)
-- Load with tables you wish to drop
INSERT @List (TableName)
SELECT name FROM [Morgage].sys.objects WHERE type = 'u' and name like '%JKL%'
SELECT name FROM [Scorecard].sys.objects WHERE type = 'u'and name like '%JKL%'
SELECT name FROM [Core].sys.objects WHERE type = 'u' and name like '%JKL%'
SET @LoopId = @@rowcount
-- Go through list and process each item
WHILE @LoopId > 0
BEGIN
SET @tblName = (SELECT TableName from @List where LoopId = @LoopId)
SET @Command = 'Drop table ' + @tblName
execute (@Command)
SET @LoopId = @LoopId - 1
END
上面的查询结果说行受到影响,但是当我去尝试测试时使用下面的查询。我确实看到了一切。我的查询实际上做了什么?我做对了吗?
SELECT name FROM [Scorecard].sys.objects WHERE type = 'u'and name like '%JKL%'
任何帮助将不胜感激。谢谢。
【问题讨论】:
-
我突然想到了两件事。
@@ROWCOUNT的值将是受上一个 select 语句影响的行数。您需要捕获并累积行数,否则您将错过 LoopId 之后的所有内容。其次,当您执行动态生成的 SQL 时,您并没有更改数据库,因此您可能会从错误的数据库中删除对象。 -
抱歉,请重新阅读您的脚本 - 然后您使用的是 SQL 2008
-
错过了多行插入... :-(
标签: sql-server-2008 tsql ddl