【问题标题】:When I am trying to drop tables using below script , it seems not working.当我尝试使用以下脚本删除表时,它似乎不起作用。
【发布时间】: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


【解决方案1】:

试试这个版本的脚本:-

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

【讨论】:

  • Msg 121,级别 15,状态 1,第 17 行 INSERT 语句的选择列表包含的项目多于插入列表。 SELECT 值的数量必须与 INSERT 列的数量相匹配。 ** 这就是我得到的错误
  • 编辑了答案 - 我忘记将 DBName 字段添加到 INSERT 语句的字段列表中。对不起。
  • 我尝试运行查询。但它只给了我来自记分卡的表名的结果。?
  • 尝试在查询中添加select * from @List 以查看它试图删除的确切内容。在 execute(@Command) 语句之后或代替它可能还值得放置一个 print @Command
  • 我正在尝试再次测试它。从那个 Morgage DB 只需要一个语句删除表。它对其他人没有任何作用。
【解决方案2】:

可能是查询默认不提交。尝试明确指定它

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多