如何使用TSQL截断数据库中除查找表之外的所有表?

时间:2015-05-21 21:02:21

标签: sql-server tsql

除了使用SQL Server 2012中的TSQL查找查找表数据之外的所有表中的所有数据的最佳方法是什么? 我希望TSQL识别并排除查找表,然后为其他表创建truncate table语句。

**几乎a similar question但它会截断所有表格。

6 个答案:

答案 0 :(得分:0)

Lookup Tables和非Lookup表的技术特性相似。只有在功能上他们是不同的。因此,不能成为区分它们的具体标准。

答案 1 :(得分:0)

除非您从设计的角度为自己做好准备,例如把所有" Lookup"在" lkup"中的表格架构,或者那种性质的东西,我认为没有办法做到这一点。正如有人提到的那样,查找表就像任何其他表一样。

答案 2 :(得分:0)

我会通过首先删除正确的顺序(依赖项)来自动使用DELETE

1)传递表名

2)禁用外键

3)清空所有表格

4)重新启用它们。

这样你就可以控制传递你想要的表名"截断"有条件的。

答案 3 :(得分:0)

或者它是否重要:

ALTER PROCEDURE 
up_ResetEntireDatabase 
@IncludeIdentReseed BIT, 
@IncludeDataReseed BIT 
AS 

EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL' 
EXEC sp_MSForEachTable 'DELETE FROM ?'

 IF @IncludeIdentReseed = 1 
BEGIN 
EXEC sp_MSForEachTable 'DBCC CHECKIDENT (''?'' , RESEED, 1)' 
END 

EXEC sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL' 

IF @IncludeDataReseed = 1 
BEGIN 
-- Populate Core Data Table Here 
END 

GO

然后一旦准备就绪,执行非常简单:

EXEC up_ResetEntireDatabase 1, 1

答案 4 :(得分:0)

我不确定你是否意味着查找表可以驱动它。

构建一个简单的表,其中包含每个数据库表的名称,并在执行脚本之前创建可以根据需要修改的列。

列可能只是告诉脚本是否截断该表或其他的标记。

这样你(脚本)在读取表名时就会知道依赖关系。如果将表顺序保持为记录编号顺序,则不需要索引。

只是另一个维护脚本。

答案 5 :(得分:0)

因此,您希望截断具有外键的表,但仅保留引用表。这应该做到。

WITH CTE_fks
AS
(
    SELECT  obj.name AS FK_NAME,
            sch1.name AS [table_schema],
            tab1.name AS [table_name],
            col1.name AS [column],
            sch2.name AS [ref_table_schema],
            tab2.name AS [referenced_table],
            col2.name AS [referenced_column]
    FROM sys.objects obj
    INNER JOIN sys.foreign_key_columns fkc
        ON obj.object_id = fkc.constraint_object_id
    INNER JOIN sys.tables tab1
        ON tab1.object_id = fkc.parent_object_id
    INNER JOIN sys.schemas sch1
        ON tab1.schema_id = sch1.schema_id
    INNER JOIN sys.columns col1
        ON col1.column_id = parent_column_id AND col1.object_id = tab1.object_id
    INNER JOIN sys.tables tab2
        ON tab2.object_id = fkc.referenced_object_id
    INNER JOIN sys.schemas sch2
        ON tab2.schema_id = sch2.schema_id
    INNER JOIN sys.columns col2
        ON col2.column_id = referenced_column_id AND col2.object_id = tab2.object_id
)

SELECT  'TRUNCATE TABLE ' + QUOTENAME(A.TABLE_SCHEMA) + '.' + QUOTENAME(A.table_name) + ';'
FROM INFORMATION_SCHEMA.TABLES A
LEFT JOIN CTE_fks B
ON A.TABLE_NAME = B.referenced_table
AND A.TABLE_SCHEMA = B.ref_table_schema
WHERE A.TABLE_TYPE = 'BASE TABLE'
AND A.TABLE_NAME != 'sysdiagrams'
AND B.table_name IS NULL