2014-10-09 108 views
0

我想写一个SQL过程砸桌子谁在他们的名字一定的模式。 喜欢的东西下面的代码:条件子句DROP TABLE

DECLARE @temp TABLE 
(
    ID bigint IDENTITY(1,1), 
    tabname sysname NOT NULL 
) 
INSERT INTO @temp 
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE '%:%' 

DECLARE @ProcessedID bigint = 0 
DECLARE @tablename sysname 
SELECT @ProcessedID = ID, @tablename = tabname FROM @temp WHERE ID > @ProcessedID ORDER BY ID DESC 
WHILE(@ProcessedID IS NOT NULL) 
BEGIN 
    DROP TABLE dbo.[@tablename] 
    SELECT @ProcessedID = ID, @tablename = tabname FROM @temp WHERE ID > @ProcessedID ORDER BY ID DESC 
END 

但@tablename不与右表名替换。任何人都可以指引我朝着正确的方向发展。

+0

您当前的代码将进入一个无限循环,由于这样的事实,@ProcessedID永远不会为 – 2014-10-09 07:23:53

+0

是的,这更是一个伪代码更好地解释这个问题。 – surega 2014-10-09 11:36:09

回答

1

你需要,当你想使用一个变量名作为参数传递给动态做,所以你需要用它在一个字符串,并执行字符串,然后做一些小改动WHILE条件适合。

我会适当地做这样的事情:

DECLARE @temp TABLE 
(
    ID bigint IDENTITY(1,1), 
    tabname sysname NOT NULL 
): 
INSERT INTO @temp 
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE '%:%'; 

DECLARE @tablename VARCHAR(255); 
DECLARE @Count INT = ISNULL((SELECT COUNT(*) FROM @temp AS t), 0); 

WHILE(@Count > 0) 
BEGIN 

    SELECT @tablename = tabname FROM @temp AS t; --if the order of drop is not significant 

    EXEC('DROP TABLE dbo.[' + @tablename+ ']'); 
    DELETE FROM @temp WHERE tabname = @tablename; 
    SET @Count = ISNULL((SELECT COUNT(*) FROM @temp AS t), 0); 
END