除了使用SQL Server 2012中的TSQL查找查找表数据之外的所有表中的所有数据的最佳方法是什么? 我希望TSQL识别并排除查找表,然后为其他表创建truncate table语句。
**几乎a similar question但它会截断所有表格。
答案 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