[英]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
有什么办法可以为架构名称传递参数(类型varchar
或nvarchar
)?
使用带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'')';
sp_msforeachtable
参数:
@ command1-是“ sp_MSforeachtable”要执行的第一个命令,并定义为nvarchar(2000)
@whereand-此参数可用于添加其他约束,以帮助标识将要选择的sysobjects表中的行,该参数也是nvarchar(2000);
警告:
我假设您的暂存区表没有外键。 否则可能会失败。
sp_
前缀命名存储过程: 在SQL Server中,sp_前缀指定系统存储过程。 如果对存储过程使用该前缀,则过程名称可能与将来将创建的系统存储过程的名称冲突。 如果发生这种冲突,如果您的应用程序引用该过程而没有按模式限定引用,则您的应用程序可能会中断。 在这种情况下,该名称将绑定到系统过程而不是您的过程。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.