情景:
我需要编写一个SQL脚本,它将删除数据库中包含大约100个表的部分或全部表中的所有记录。
有些表格是'数据'表格,有些是查找'表。他们的名字中没有任何内容可以表明它们是什么。
有时我会希望脚本只删除“数据”中的记录。表格,在其他情况下,我会想用它来删除所有表格中的数据。
必须以非常具体的顺序从表中删除记录,以防止外键约束违规。
我最初的想法是在脚本的开头创建一个变量 - 类似@EmptyLookupTables
- 我可以设置为true或false,然后我可以将DELETE
语句包装在{ {1}}语句,只有在变量值为真时才执行它们。
但是,由于外键约束,我需要在几乎每个IF...
语句之后包含GO
命令,并且变量不会在这些批次之间保持不变。
如何编写一个脚本,以正确的顺序从表中删除记录,但根据单个变量的值跳过某些表?该数据库位于Microsoft SQL Server 2016中。
答案 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