SQL Server存储过程用于清空特定表

时间:2015-02-01 17:39:21

标签: sql-server tsql stored-procedures

我有一个存储过程,应根据其名称截断特定表。

必须截断名称中没有“A”作为第一个字符的表。

问题是这段代码不起作用!请帮忙

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[return_data]
  @DBName varchar(100)
AS

declare @i int, @tc int
set @i = 1

DECLARE @sql NVARCHAR(100)
SET @sql = 'USE ' + QUOTENAME(@DBName) + '

DECLARE cur CURSOR FOR SELECT TABLE_NAME FROM information_schema.tables
'
EXECUTE(@sql)

OPEN cur

declare @tbl_name nvarchar(100)
declare @first_char char(1)

FETCH NEXT FROM cur INTO @tbl_name

WHILE @@FETCH_STATUS = 0 BEGIN

    set @first_char = SUBSTRING(@tbl_name, 0, 1)

    set @sql = 'DELETE FROM ' + QUOTENAME(@tbl_name)
    if (@first_char != 'A')
    begin
      EXECUTE(@sql)
    end

    FETCH NEXT FROM cur INTO @tbl_name
END

CLOSE cur    
DEALLOCATE cur

return

1 个答案:

答案 0 :(得分:2)

问题在于SUBSTRING功能。起始位置是基于1的序数,而不是基于0的序数。尝试

SUBSTRING(@tbl_name, 1, 1)

LEFT(@tbl_name, 1)

另外,我建议你养成使用模式限定表名的习惯,以避免含糊不清。