我的脚本出现问题,因为它会搜索包含' Dummy'在表名中。我有一个SELECT查询,其结果将是要删除的表。
SELECT Row_Number() Over (Order By name) As RowNum
, name
FROM sys.all_objects
WHERE type = 'U'
and name like '%Dummy%'
and schema_id = @schemaID
然后又回来了:
RowNum name
1 Dummy
2 DummyJoinTbl1
3 DummyJoinTbl2
4 DummyJoinTbl3
但是当我执行下面的脚本时,
DECLARE
@schemaName nvarchar(100),
@schemaID int,
@tblName nvarchar(100) = '',
@cnt int = 1,
@rowNumber int = 1,
@SQL nvarchar(100)
SET @schemaName = (select SCHEMA_NAME()) -- this is dbo
SET @schemaID = (select SCHEMA_ID()) -- this is 1
BEGIN
WHILE (@cnt > 0)
BEGIN
SELECT @tblName = +name
FROM
(
SELECT Row_Number() Over (Order By name) As RowNum
, name
FROM sys.all_objects
WHERE type = 'U'
and name like '%Dummy%'
and schema_id = @schemaID
) ReferenceTable
WHERE RowNum = @rownumber
SET @cnt = @@ROWCOUNT
SET @rownumber = @rownumber + 1
IF (@cnt > 0)
BEGIN
PRINT 'DROP TABLE ' + @schemaName + '.' + @tblName + ' - RowCount:' + cast(@cnt as nvarchar(100))
set @SQL = 'DROP TABLE ' + @schemaName + '.' + @tblName
exec sp_executesql @SQL
END
END
PRINT 'DONE'
END
它返回的结果:
DROP TABLE dbo.Dummy - RowCount:1
DROP TABLE dbo.DummyJoinTbl2 - RowCount:1
DONE
错过其他牌桌的原因可能是什么?当我删除
set @SQL = 'DROP TABLE ' + @schemaName + '.' + @tblName
exec sp_executesql @SQL
它将打印所有表格。
DROP TABLE dbo.Dummy - RowCount:1
DROP TABLE dbo.DummyJoinTbl1 - RowCount:1
DROP TABLE dbo.DummyJoinTbl2 - RowCount:1
DROP TABLE dbo.DummyJoinTbl3 - RowCount:1
DONE
请注意,给定的表格都是空的。提前谢谢。
答案 0 :(得分:1)
这是使用光标的理想场所,如果你这样做,你将需要更少的代码。这是一个简化的示例,它假设您只想从单个DB中删除表:
USE TempDB1;
CREATE TABLE test1 (i INT);
CREATE TABLE test2 (i INT);
CREATE TABLE test3 (i INT);
CREATE TABLE test4 (i INT);
DECLARE @tableName VARCHAR(200),
@sql NVARCHAR(MAX);
DECLARE c CURSOR FAST_FORWARD FOR
SELECT name
FROM sys.all_objects
WHERE type = 'U'
AND name LIKE '%test%'
AND schema_id = SCHEMA_ID();
OPEN c;
FETCH NEXT FROM c INTO @tableName;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = 'DROP TABLE ' + @tableName;
PRINT @sql;
EXEC sp_executesql @sql;
FETCH NEXT FROM c INTO @tableName;
END;
CLOSE c;
DEALLOCATE c;
答案 1 :(得分:0)
那是因为删除第一个表后select语句的结果变为下一个:
1 DummyJoinTbl1
2 DummyJoinTbl2
3 DummyJoinTbl3
这是跳过DummyJoinTbl1的原因,因为@rownumber = 2.下一个循环@rownumber = 3并且它超过了记录数。 不要使用WHERE RowNum = @rownumber
使用SELECT TOP(1)@tblName = + name而不嵌套select和ROW_NUMBER()
使用1选择游标而不是在WHILE语句中选择N次也更好