所以我正在尝试在不同的数据库中创建程序。我不应该知道数据库的名称。我试图制作嵌套游标,第一个用动态方式获取数据库名称,另一个用于创建/改变过程;我使用EXISTS创建过程而不是EXEST来改变它们。但不知何故,数据库仍然存在于'master'中,而且它永远不会覆盖其他数据库。我知道我的内嵌式光标存在问题,但我不知道这是什么。 这是我的编码:
int blankpos = 3, i, j;
for ( i = 0; i < 4; i++ ) {
for ( j = 0; j < 5; j++ ) {
if ( j == blankpos )
System.out.print(" ");
else
System.out.print("*");
}
blankpos--;
if ( blankpos < 1 )
blankpos = 4;
System.out.print("\n");
}
P.S:我不应该知道数据库的名称,因为我正在尝试编写“常规”程序,因此它可以应用于所有sql-server用户的数据库,而不仅仅是我的数据库。
P.S2:我使用的是Nesting Cursors但是由于它们的灾难性表现,我也很欣赏其他方式!
干杯!
答案 0 :(得分:1)
尝试使用while语句,并迭代临时变量表,而不是使用游标。
DECLARE @Databases TABLE
(
ID int IDENTITY(1,1),
DatabaseName varchar(100)
)
INSERT INTO @Databases
SELECT name FROM sys.databases
DECLARE @Idx int = (select count(*) from @Databases)
WHILE(@Idx > 0)
BEGIN
DECLARE @CurrentDatabase varchar(100) = (select DatabaseName from @Databases where @Idx = ID )
DECLARE @SchemaData TABLE
(
ID int IDENTITY(1,1),
Table_Schema varchar(20),
Table_Name varchar(255)
)
DECLARE @Sql varchar(max) = 'SELECT [TABLE_SCHEMA],[TABLE_NAME] FROM [' + @CurrentDatabase + '].[INFORMATION_SCHEMA].[TABLES]'
INSERT INTO @SchemaData
EXEC (@Sql)
DECLARE @SchemaIdx int = (select count(*) from @SchemaData)
WHILE(@SchemaIdx > 0)
BEGIN
DECLARE @CurrentSchema varchar(20), @CurrentTable varchar(255)
SELECT @CurrentSchema = Table_Schema, @CurrentTable = Table_Name from @SchemaData where ID = @SchemaIdx
DECLARE @Sql2 varchar(max) =
'IF EXISTS(SELECT * FROM sys.objects WHERE type = ''P'' AND OBJECT_ID = OBJECT_ID(' + @CurrentTable + '))
exec(''ALTER PROCEDURE USP_SELECT_'+ @CurrentTable + ' AS
BEGIN
SELECT *
FROM '+ @CurrentSchema + '.'+ @CurrentTable + '
END ;'')'
PRINT @Sql2
SET @SchemaIdx = @SchemaIdx - 1;
END
SET @Idx = @Idx - 1;
END