尝试编写一些T-SQL来遍历数据库表

时间:2014-05-20 23:50:55

标签: sql-server sql-server-2008-r2 sql-server-2012 azure-sql-database

我在开发人员上使用SQL Server 2008 R2,在SQL Azure上使用测试和实时。

我希望编写一个小程序来重置身份种子,因为SQL Azure不支持DBCC。

我有一些可用的解决方法代码,但我不想为每个表写出来,所以试图编写一个迭代数据库表的例程。

表:

SELECT * FROM information_schema.tables

代码:

delete from TABLE_NAME where Id>150000
GO
SET IDENTITY_INSERT [TABLE_NAME] ON
GO 
INSERT INTO [TABLE_NAME](Id) VALUES(150000)
GO 
delete from TABLE_NAME where Id=150000
GO
SET IDENTITY_INSERT [TABLE_NAME] OFF
GO

我想我需要将它包装在一个循环中。对不起,我的T-SQL并不那么强大,因此请求帮助。

TABLE_NAME开始省略aspnet_的所有表格并仅使用TABLE_TYPE = "BASE TABLE"

也会有所帮助

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

除非别人知道我不知道的伎俩,否则您可能会使用动态SQL并使用游标或临时表迭代表名列表。游标方法看起来像这样:

declare @TableName nvarchar(257);
declare @sql nvarchar(max);

declare TableCursor cursor read_only for
select 
    TABLE_SCHEMA + '.' + TABLE_NAME 
from 
    INFORMATION_SCHEMA.TABLES 
where 
    TABLE_NAME not like 'aspnet\_%' escape '\' and
    TABLE_TYPE = 'BASE TABLE';

open TableCursor;
fetch next from TableCursor into @TableName;

while @@fetch_status = 0
begin
    set @sql = 'select top 1 * from ' + @TableName;
    exec sp_executesql @sql;
    fetch next from TableCursor into @TableName;
end

close TableCursor;
deallocate TableCursor;

您可以阅读有关游标here的更多信息。或者,您可以使用内存表来执行此操作:

declare @Tables table (RowId int identity(1, 1), TableName nvarchar(257));
declare @TableName nvarchar(257);
declare @Index int;
declare @TableCount int;
declare @sql nvarchar(max);

insert into @Tables (TableName)
select 
    TABLE_SCHEMA + '.' + TABLE_NAME 
from 
    INFORMATION_SCHEMA.TABLES 
where 
    TABLE_NAME not like 'aspnet\_%' escape '\' and
    TABLE_TYPE = 'BASE TABLE';

set @TableCount = @@rowcount;
set @Index = 1

while @Index <= @TableCount
begin
    select @TableName = TableName from @Tables where RowId = @Index;
    set @sql = 'select top 1 * from ' + @TableName;
    exec sp_executesql @sql;
    set @Index = @Index + 1;
end

为了简洁起见,我的示例使用了比你更简单的SQL语句 - 我只是从每个表中选择一条记录 - 但这应该足以说明如何完成这项工作。