Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何使用TSQL截断数据库中除查找表以外的所有表?_Sql Server_Tsql - Fatal编程技术网

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

Sql server 如何使用TSQL截断数据库中除查找表以外的所有表?,sql-server,tsql,Sql Server,Tsql,使用SQL Server 2012及以下版本中的TSQL从所有表中删除所有数据(查找表数据除外)的最佳方法是什么? 我希望TSQL识别并排除查找表,然后为其他表创建truncate table语句 **几乎没有,但它截断了所有的表。查找表和非查找表在技术特性上相似。只是在功能上它们是不同的。因此,不会有具体的标准来区分它们。除非您从设计的角度设置自己能够做到这一点,例如,将所有“查找”表放在“lkup”模式中,或类似的性质,否则我认为没有办法做到这一点。正如有人已经提到的,查找表与其他表一样。首

使用SQL Server 2012及以下版本中的TSQL从所有表中删除所有数据(查找表数据除外)的最佳方法是什么? 我希望TSQL识别并排除查找表,然后为其他表创建truncate table语句


**几乎没有,但它截断了所有的表。

查找表和非查找表在技术特性上相似。只是在功能上它们是不同的。因此,不会有具体的标准来区分它们。

除非您从设计的角度设置自己能够做到这一点,例如,将所有“查找”表放在“lkup”模式中,或类似的性质,否则我认为没有办法做到这一点。正如有人已经提到的,查找表与其他表一样。

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

1) 传递表名

2) 禁用外键

3) 清空并删除所有表

4) 重新启用这些密钥


通过这种方式,您可以控制传递要用条件“截断”的表名。

或者这是否重要:

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

我不确定你的意思是不是像这样的查找表可以驱动这个

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

这些列可以只是指示脚本是否截断该表或其他表的标志

这样,您(脚本)将在读取表名时了解依赖项。如果以记录编号顺序保持表顺序静态,则不需要索引


只是另一个维护脚本。

所以您希望截断具有外键的表,但保留引用表。这应该可以做到

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

是否有任何属性来区分引用完整性中的表?是否有任何属性来区分引用完整性中的表?您是否碰巧有一个工作的TSQL脚本以便我可以测试它?您认为查找表与其他表有什么不同?。他们的名字里有图案吗?如果您无法找到一种手动方式来区分它们,那么脚本将不会。假设我们使用[FK_Parent_Child]名称标准定义了约束。i、 e.当您从数据库中删除时,使用复选添加约束[FK_Parent_Child]外键([TypeID])修改表[dbo].[Parent],引用[dbo].[Child]([ID])@DOT,我个人会犹豫说,比如说我们定义的。您仍在进行假设,不确定如何区分表。对于需要的表,您可能有许多其他外键。外键并不总是在可查找表和实际表之间建立关系。不,这不是一个假设,它正是这样。我同意“外键并不总是在lookuptables和realt表之间建立关系”,但在本例中,这正是数据库的设计方式。我也把我的ID改成了学生,很抱歉。这是一个测试数据库,所以没什么好担心的。当然,这很重要,否则我为什么还要问问题呢?脚本将删除所有表中的所有数据。我不喜欢这个想法。@rrg6699建议编辑一个答案,并从中加/减,除非你的意思是每个帖子都是一个完全不同的答案。@Student,我只回答了一般问题。您必须将代码添加到您的特定需求中此脚本似乎可以工作,但您能否完成脚本,使其将数据库返回到原始状态(启用外键),以便我可以测试它。顺便说一下,我注意到上面的脚本,它还生成
TRUNCATE TABLE[dbo].[sysdiagrams]
,我认为这不应该是所选表的一部分。您不能重新启用外键,因为查找表中没有任何内容。只需添加一个where子句来排除sysdiagramsAll查找表就有了值。它们不是空的,因此我们应该能够重新启用它们。这就是这个问题的关键所在。在删除其他表中的数据时,保持查找表中的数据不变。哦,对不起。我有点困惑。我明白你的意思,我不认为你需要禁用外键。让我编辑我的答案。不,这不是我将使用的方法。系统视图中有各种各样的信息。创建额外的表没有意义!