【问题标题】:SQL : Table names in a table. How do I loop through them and drop them conditionally?SQL :表中的表名。我如何遍历它们并有条件地删除它们?
【发布时间】:2017-11-18 06:04:41
【问题描述】:

Table

请问,有人可以建议我如何将 SQL 表中的表作为值删除吗?根据示例,如果它们已过期,我想删除它们。

https://i.stack.imgur.com/POhfV.png

提前致谢!

【问题讨论】:

  • 我不会给你一个完整的答案,因为你似乎没有尝试过任何事情。不过我会给出一个提示,我在使用带有 stuff 函数的查询之前已经这样做了,或者它可能是“for xml path”,或者两者兼而有之。那是很久以前。您还可以查找 tsql 游标。

标签: sql tsql


【解决方案1】:

如果您不想使用光标,这是另一种方法:

DECLARE @Run INT,
        @SQL VARCHAR(500)

CREATE TABLE #TableList
(
  TableID INT IDENTITY(1,1),
  TableCMD VARCHAR(500)
);

INSERT INTO #TableList (TableCMD)
SELECT 'DROP TABLE ' + tablename
FROM   YourTable
WHERE  ExpiryDate < GETDATE();

SET @Run = (SELECT  MAX(TableID)
            FROM    #TableList)
WHILE @Run > 0
BEGIN
    SELECT @SQL = ( SELECT  TableCMD 
                    FROM    #TableList
                    WHERE   TableID = @Run)
    EXEC (@SQL)
    SET @Run = @Run - 1
END

您可能还应该从主表中删除过期表的记录,这样下次尝试删除不存在的表时就不会失败。或者更好的是,添加一个状态列将它们标记为已删除,但保留记录以供参考。

【讨论】:

  • 我也更喜欢这种non-cursor 循环遍历表格的方式。
  • 感谢 Aaron,这很有魅力。在我尝试了这么多事情之后,这很完美!
  • @smad 很高兴为您提供帮助,请接受答案 :) 旁注,您的问题遭到了反对,这主要是因为您链接到图像而不是输入代码。图像不受欢迎,因为它们可能会过期,并且有类似问题的未来访问者将无法看到您的代码。欢迎来到 SO,希望见到你。
  • 这是我可能永远无法理解的事情,它让我发疯!我一直在寻找一种“无循环”的方法来解决这样的问题,(因为我的老板通常可以,而且每次讲座都说“不要循环”)然后我最终会用人们可以轻松理解的语言循环或处理表格。 (那时我几乎准备好伤害任何喜欢 SQL 并越过我的方式的人。)所有这些时间和精力都是浪费,因为该语言的设计没有一种高性能的循环方式,正如这里所见 - 需要! >:((此评论将有助于以后的 cmets 进一步链接到该主题:P)
【解决方案2】:

像这样使用游标和动态查询:Drop all tables whose names begin with a certain string

DECLARE @tname varchar(100)
DECLARE table_cursor CURSOR FOR
    SELECT TableName FROM TableCatalog WHERE GETDATE() > ExpiryDate 

OPEN cursor 
FETCH NEXT FROM table_cursor INTO @tname 
WHILE @@fetch_status = 0 
BEGIN
    EXECUTE sp_executesql 'DROP TABLE ' + @tname 
    FETCH NEXT FROM table_cursor INTO @tname 
END
CLOSE table_cursor;
DEALLOCATE table_cursor

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    • 2014-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多