如何使用游标在不同的数据库中创建过程

时间:2015-12-11 09:57:52

标签: sql sql-server tsql stored-procedures cursor

所以我正在尝试在不同的数据库中创建程序。我不应该知道数据库的名称。我试图制作嵌套游标,第一个用动态方式获取数据库名称,另一个用于创建/改变过程;我使用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但是由于它们的灾难性表现,我也很欣赏其他方式!

干杯!

1 个答案:

答案 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