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

时间:2015-11-22 15:02:45

标签: sql sql-server tsql

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

search

有没有办法可以为模式名称传递参数(类型search.gspCREATE PROC sp_Truncate AS BEGIN EXEC sp_MSforeachtable @command1 = 'TRUNCATE TABLE ?' END GO )?

2 个答案:

答案 0 :(得分:5)

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

referential constraints

光标版本:

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

答案 1 :(得分:1)

您可以使用(请记住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_前缀指定系统存储过程。如果   您使用该前缀作为您的存储过程,您的名称   过程可能与系统存储过程的名称冲突   这将在未来创建。如果发生这样的冲突,你的   如果您的应用程序引用过程,应用程序可能会中断   没有通过模式限定引用。在这种情况下,   name将绑定到系统过程而不是您的过程。