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

Jus*_*tin 1 sql t-sql sql-server

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

CREATE PROC sp_Truncate
AS
BEGIN
    EXEC sp_MSforeachtable @command1 = 'TRUNCATE TABLE ?'
END
GO
Run Code Online (Sandbox Code Playgroud)

有什么办法可以传递模式名称的参数(类型varcharnvarchar)吗?

Pரத*_*ீப் 5

它是安全使用Delete的语句没有where条款来代替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
Run Code Online (Sandbox Code Playgroud)

光标版本:

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
Run Code Online (Sandbox Code Playgroud)