SQL 用于清空特定表的服务器存储过程
SQL Server stored procedure to empty specific tables
我有一个存储过程,它应该根据名称截断特定的表。
名称中第一个字符不是 "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
问题出在 SUBSTRING 函数上。起始位置是从 1 开始的序数,而不是从 0 开始的。尝试
SUBSTRING(@tbl_name, 1, 1)
或
LEFT(@tbl_name, 1)
此外,我建议您养成使用模式限定 table 名称以避免歧义的习惯。
我有一个存储过程,它应该根据名称截断特定的表。
名称中第一个字符不是 "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
问题出在 SUBSTRING 函数上。起始位置是从 1 开始的序数,而不是从 0 开始的。尝试
SUBSTRING(@tbl_name, 1, 1)
或
LEFT(@tbl_name, 1)
此外,我建议您养成使用模式限定 table 名称以避免歧义的习惯。