【发布时间】:2015-09-26 18:39:36
【问题描述】:
我的脚本有问题,它会搜索所有表名中包含“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
请注意,给定的表格都是空的。提前致谢。
【问题讨论】:
-
把
set @SQL = 'DROP TABLE ' + @schemaName + '.' + @tblName改成SELECT @SQL = 'DROP TABLE ' + @schemaName + '.' + @tblName能用吗? -
即使我使用 SELECT 而不是 SET 还是一样
-
如何将@SQL 设置为大于100 的长度?这似乎是一个截断问题。
-
并不是真正的截断问题,因为预期的字符少于 100。我确实尝试将 @SQL 的长度从 100 更改为 1000,但仍然相同。我认为这可能会涉及性能问题。我无权为此更改硬件或性能。我只能更改代码。
标签: sql sql-server if-statement stored-procedures while-loop