繁体   English   中英

如何编写存储过程仅截断特定模式的表

[英]How can I write stored procedure truncate only tables of the specific schema

我的数据库中有不同类型的架构。 如果要删除具有暂存模式的表,如何修改此存储过程?

CREATE PROC sp_Truncate
AS
BEGIN
    EXEC sp_MSforeachtable @command1 = 'TRUNCATE TABLE ?'
END
GO

有什么办法可以为架构名称传递参数(类型varcharnvarchar )?

使用带where子句的Delete语句是安全的,而不是truncate ,如果您有referential constraints ,则truncate可能会失败。 试试这个查询

Declare @sql Nvarchar(max)=''

SELECT @sql += ' delete from ' + s.NAME + '.' + t.NAME 
              +' Go DBCC CHECKIDENT ('''+s.NAME + '''.''' + t.NAME+''', RESEED, 0) GO '
FROM   sys.tables t
       JOIN sys.schemas s
         ON t.[schema_id] = s.[schema_id]
WHERE  t.type = 'U' 
and s.name = 'schema_name' -- your schema name

Exec sp_executesql @sql

游标版本:

DECLARE @s_name VARCHAR(128)
DECLARE @t_name VARCHAR(128) 

DECLARE db_cursor CURSOR FOR  
SELECT  s.NAME as  Schema_Nam , t.NAME as Table_Name
FROM   sys.tables t
       JOIN sys.schemas s
         ON t.[schema_id] = s.[schema_id]
WHERE  t.type = 'U' 
and s.name = 'schema_name'   

OPEN db_cursor   
FETCH NEXT FROM db_cursor INTO @s_name,@t_name   

WHILE @@FETCH_STATUS = 0   
BEGIN   
       set @sql += ' delete from ' + s.NAME + '.' + t.NAME 
                  +' Go DBCC CHECKIDENT ('''+s.NAME + '''.''' + t.NAME+''', RESEED, 0) GO '   
FETCH NEXT FROM db_cursor INTO @s_name,@t_name   
END   

CLOSE db_cursor   
DEALLOCATE db_cursor

Exec sp_executesql @sql

您可以使用(请注意, sp_msforeachtable是未扩展存储过程):

EXEC Sp_msforeachtable 
    @command1='Truncate Table ?', @whereand='and Schema_Id=Schema_id(''SchemaName'')';

SqlFiddleDemo

sp_msforeachtable参数:

@ command1-是“ sp_MSforeachtable”要执行的第一个命令,并定义为nvarchar(2000)

@whereand-此参数可用于添加其他约束,以帮助标识将要选择的sysobjects表中的行,该参数也是nvarchar(2000);

警告:

我假设您的暂存区表没有外键。 否则可能会失败。

不要使用sp_前缀命名存储过程:

在SQL Server中,sp_前缀指定系统存储过程。 如果对存储过程使用该前缀,则过程名称可能与将来将创建的系统存储过程的名称冲突。 如果发生这种冲突,如果您的应用程序引用该过程而没有按模式限定引用,则您的应用程序可能会中断。 在这种情况下,该名称将绑定到系统过程而不是您的过程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM