Mar*_*dle 256
请注意,如果您设置了任何参照完整性,则TRUNCATE将不起作用.
在这种情况下,这将工作:
EXEC sp_MSForEachTable 'DISABLE TRIGGER ALL ON ?'
GO
EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
GO
EXEC sp_MSForEachTable 'DELETE FROM ?'
GO
EXEC sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL'
GO
EXEC sp_MSForEachTable 'ENABLE TRIGGER ALL ON ?'
GO
Run Code Online (Sandbox Code Playgroud)
小智 19
在我最近的项目中,我的任务是使用sql语句清理整个数据库,每个表都有许多约束,如主键和外键.数据库中有超过1000个表,因此无法在每个表和永久表上编写删除查询.
通过使用名为sp_MSForEachTable的存储过程,它允许我们轻松地处理单个数据库中每个表的一些代码.这意味着它用于处理单个T-SQL命令或针对数据库中的每个表的不同T-SQL命令.
因此,请按照以下步骤截断SQL Server数据库中的所有表:
步骤1-使用以下sql查询禁用数据库的所有约束:
EXEC sys.sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
步骤2-使用以下sql命令对数据库的每个表执行删除或截断操作:
EXEC sys.sp_msforeachtable 'DELETE FROM ?'
Run Code Online (Sandbox Code Playgroud)
步骤3-使用以下sql语句启用数据库的所有约束:
EXEC sys.sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL'
Run Code Online (Sandbox Code Playgroud)
Gon*_*edo 14
我不得不删除所有行并使用下一个脚本执行此操作:
DECLARE @Nombre NVARCHAR(MAX);
DECLARE curso CURSOR FAST_FORWARD
FOR
Select Object_name(object_id) AS Nombre from sys.objects where type = 'U'
OPEN curso
FETCH NEXT FROM curso INTO @Nombre
WHILE (@@FETCH_STATUS <> -1)
BEGIN
IF (@@FETCH_STATUS <> -2)
BEGIN
DECLARE @statement NVARCHAR(200);
SET @statement = 'DELETE FROM ' + @Nombre;
print @statement
execute sp_executesql @statement;
END
FETCH NEXT FROM curso INTO @Nombre
END
CLOSE curso
DEALLOCATE curso
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助!
Wil*_*sch 14
就我而言,我需要将 QUOTED_IDENTIFIER 设置为开启。这导致对上述 Mark Rendle 的回答进行了轻微修改:
EXEC sp_MSforeachtable 'DISABLE TRIGGER ALL ON ?'
GO
EXEC sp_MSforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
GO
EXEC sp_MSforeachtable 'SET QUOTED_IDENTIFIER ON; DELETE FROM ?'
GO
EXEC sp_MSforeachtable 'ALTER TABLE ? CHECK CONSTRAINT ALL'
GO
EXEC sp_MSforeachtable 'ENABLE TRIGGER ALL ON ?'
GO
Run Code Online (Sandbox Code Playgroud)
这是一个解决方案:
INFORMATION_SCHEMA.TABLES一个特定的数据库SELECTS 基于某些搜索条件的表格sysdiagrams和__RefactorLog我最初尝试过EXECUTE sp_MSforeachtable 'TRUNCATE TABLE ?',但删除了我的图表.
USE <DB name>;
GO
-- Disable all constraints in the database
EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"
declare @catalog nvarchar(250);
declare @schema nvarchar(250);
declare @tbl nvarchar(250);
DECLARE i CURSOR LOCAL FAST_FORWARD FOR select
TABLE_CATALOG,
TABLE_SCHEMA,
TABLE_NAME
from INFORMATION_SCHEMA.TABLES
where
TABLE_TYPE = 'BASE TABLE'
AND TABLE_NAME != 'sysdiagrams'
AND TABLE_NAME != '__RefactorLog'
OPEN i;
FETCH NEXT FROM i INTO @catalog, @schema, @tbl;
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @sql NVARCHAR(MAX) = N'DELETE FROM [' + @catalog + '].[' + @schema + '].[' + @tbl + '];'
/* Make sure these are the commands you want to execute before executing */
PRINT 'Executing statement: ' + @sql
-- EXECUTE sp_executesql @sql
FETCH NEXT FROM i INTO @catalog, @schema, @tbl;
END
CLOSE i;
DEALLOCATE i;
-- Re-enable all constraints again
EXEC sp_msforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"
Run Code Online (Sandbox Code Playgroud)