我在开发人员上使用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"
非常感谢任何帮助。
答案 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语句 - 我只是从每个表中选择一条记录 - 但这应该足以说明如何完成这项工作。