Sql server 2008 当我试图使用下面的脚本删除表时,它似乎不起作用。

Sql server 2008 当我试图使用下面的脚本删除表时,它似乎不起作用。,sql-server-2008,tsql,ddl,Sql Server 2008,Tsql,Ddl,我正在尝试从每个服务器删除表。我的服务器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

我正在尝试从每个服务器删除表。我的服务器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%'

任何帮助都将不胜感激。谢谢

可能是默认情况下没有提交查询。尝试显式指定它

尝试此版本的脚本:-

DECLARE
   @LoopId     int,
   @Command    varchar(500),
   @tblName varchar(100),
   @dbName sysname


DECLARE @List TABLE
(
   DBName sysname not null,
   TableName  sysname  not null,
   LoopId     int      not null  identity(1,1)
)

--  Load with tables you wish to drop

INSERT @List (DBName, TableName)

SELECT 'Morgage',name FROM [Morgage].sys.objects WHERE type = 'u' and name like '%JKL%'
UNION
SELECT 'Scorecard',name FROM [Scorecard].sys.objects WHERE type = 'u'and name like '%JKL%'
UNION
SELECT 'Core',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

SELECT @tblName = TableName, @dbName=DBName from @List where LoopId = @LoopId

SET @Command = 'USE ' + @dbName + ';if not exists(select 1 from sys.foreign_keys where parent_object_id=object_id(''' + @tblName + ''',''U'')' + char(10) + 'Drop table ' + @tblName + ';'

execute (@Command)

SET @LoopId = @LoopId - 1
END

我突然想到两件事。
@@ROWCOUNT
的值将是上次select语句中受影响的行数。您需要捕获并累积行数,否则将错过该LoopId之后的所有内容。其次,在执行动态生成的SQL时,您没有更改数据库,因此可能会从错误的数据库中删除对象。抱歉,请重新阅读您的脚本-您正在使用SQL 2008,但错过了多行插入…:-(Msg 121,级别15,状态1,第17行INSERT语句的select列表包含的项目比INSERT列表多。select值的数量必须与INSERT列的数量匹配。**这就是我得到的错误编辑了答案-我忘记了将DBName字段添加到INSERT语句的字段列表中。抱歉,我尝试运行了查询。但它只提供记分卡中表名的结果。请尝试在查询中放置一个
select*from@List
,以查看它正试图删除的内容。在execute(@Command)之后或在execute(@Command)的位置放置一个
print@Command
,也可能值得一试语句我正在尝试再次测试它。它只从Morgage DB中删除了一个语句表。它对其他语句没有任何作用。