选择性地从变量中删除表中的记录

时间:2017-08-02 13:31:05

标签: sql sql-server tsql

情景:

  • 我需要编写一个SQL脚本,它将删除数据库中包含大约100个表的部分或全部表中的所有记录。

  • 有些表格是'数据'表格,有些是查找'表。他们的名字中没有任何内容可以表明它们是什么。

  • 有时我会希望脚本只删除“数据”中的记录。表格,在其他情况下,我会想用它来删除所有表格中的数据。

  • 必须以非常具体的顺序从表中删除记录,以防止外键约束违规。

我最初的想法是在脚本的开头创建一个变量 - 类似@EmptyLookupTables - 我可以设置为true或false,然后我可以将DELETE语句包装在{ {1}}语句,只有在变量值为真时才执行它们。

但是,由于外键约束,我需要在几乎每个IF...语句之后包含GO命令,并且变量不会在这些批次之间保持不变。

如何编写一个脚本,以正确的顺序从表中删除记录,但根据单个变量的值跳过某些表?该数据库位于Microsoft SQL Server 2016中。

2 个答案:

答案 0 :(得分:2)

我知道如果不在TSQL中为DDL编写解析器就知道这样做的唯一方法就是把它转过来。

使用相同的架构创建新数据库;填充查找表,但没有您不想要的记录。然后填充数据表,但再次省略您不想要的记录。最后,重命名或删除旧数据库,并将新数据库重命名为原始名称。

但是,它仍然很难。

答案 1 :(得分:1)

创建一个#temp表并将变量存储在其中,它将在GO个分开的批次中保留。然后只需检查每批中的临时表。

SELECT @EmptyLookupTables AS EmptyLookupTables INTO #tmp
GO
DECLARE @EmptyLookupTables BIT
SELECT @EmptyLookupTables = EmptyLookupTables FROM #tmp
DELETE FROM YourLookupTable WHERE @EmptyLookupTables = 1 
GO

或者你甚至可以直接加入删除命令

中的#temp表
DELETE l FROM YourLookupTable  l
INNER JOIN #tmp t ON t.EmptyLookupTables = 1