我的数据库中有不同类型的架构。如果我想删除具有分段模式的表,我该如何修改此存储过程?
search
有没有办法可以为模式名称传递参数(类型search.gsp
或CREATE PROC sp_Truncate
AS
BEGIN
EXEC sp_MSforeachtable @command1 = 'TRUNCATE TABLE ?'
END
GO
)?
答案 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将绑定到系统过程而不是您的过程。