如何从SQL Server数据库中的所有表中删除所有行?

152 sql-server-2005

如何从SQL Server数据库中的所有表中删除所有行?

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)

  • 在SQL Azure中不可用:( (10认同)
  • 以下是为 SQL Azure 创建 sp_MSForEachTable 过程的链接 https://gist.github.com/metaskills/893599 (2认同)

小智 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)


Zac*_*ith 9

这是一个解决方案:

  1. 降低约束(感谢这篇文章)
  2. 迭代INFORMATION_SCHEMA.TABLES一个特定的数据库
  3. SELECTS 基于某些搜索条件的表格
  4. 删除这些表中的所有数据
  5. 重新添加约束
  6. 允许忽略某些表格,例如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)

  • @influent - 现在需要考虑非dbo模式 (2认同)
  • 事实上@FluidMechanicsPotentialFlows - `EXECUTE sp_executesql @sql` 语句被注释掉。这是为了防止有人在没有先阅读的情况下将此 SQL 复制/粘贴到 SSMS 中 (2认同)