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

Sql server 用于清空特定表的SQL Server存储过程,sql-server,tsql,stored-procedures,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 =

我有一个存储过程,它应该根据特定表的名称截断它们

必须截断名称中没有“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的序号。试一试

子字符串(@tbl_name,1,1)

左(@tbl\u name,1)


此外,我建议您养成对表名进行模式限定的习惯,以避免歧义。

发生了什么?错误还是什么都没有?执行代码时什么都不会发生!我认为问题出在我的IF语句中。虽然Dan对问题以及如何解决问题的看法是正确的,但您应该运行此命令以了解原因:
SELECT SUBSTRING('test',0,1)
。它返回一个空字符串。将
set@sql='DELETE
移动到
if(@first_char
块中不会有任何影响。