terça-feira, 31 de maio de 2011

Gerar script com primary keys e foreign keys no SQL SERVER 2005/2008 (CORREÇÃO)

No começo do ano publiquei um post, com um script de geração de toda as constraints de PKs e FKs de um determinado banco de dados. Ao re-utilizar o script, descobri que alguns ajustes eram necessários. O maior problema, foi na montagem da criação das PKs, que era seguidas do sufixo “+ ' ON ' + @FileName +”, designando o filegroup que o índice clusterizado deveria ser alocado. Para não dar erros, alterei para + ' ON [' + @FileName +']'+, eliminando o problema. Um outro equívovo, um pouco menos sutil, foi no final nas FKs, onde o comando “references” estava escrito incorretamente (?????), estava escrito “REFRENCES”.

 

Acho que era o SEU CREISSON que estava blogando neste dia...hehehe

 

Adicionei também quebras de linha e o comando “GO” (CHAR(13) + CHAR(10) +'GO'),  que melhoram a legibilidade do código. Segue abaixo com as alterações, já testadas...

 

 

DECLARE cpk CURSOR FOR

 

  SELECT DISTINCT c.table_name,

 

                  c.constraint_name,

 

                  f.name

 

  FROM   sys.indexes i

 

         INNER JOIN sys.filegroups f

 

           ON i.data_space_id = f.data_space_id

 

         INNER JOIN sys.all_objects o

 

           ON i.[OBJECT_ID] = o.[OBJECT_ID]

 

         INNER JOIN information_schema.table_constraints c

 

           ON o.name = c.table_name

 

  WHERE  c.constraint_type = 'PRIMARY KEY'

 

  ORDER  BY c.table_name

 

 

DECLARE @PkTable SYSNAME

DECLARE @PkName SYSNAME

DECLARE @FileName SYSNAME

 

 

 

-- Loop through all the primary keys

 

OPEN cpk

 

 

 

FETCH NEXT FROM cpk INTO @PkTable, @PkName, @FileName

 

 

 

WHILE ( @@FETCH_STATUS = 0 )

  BEGIN

 

      DECLARE @PKSQL NVARCHAR(MAX)

 

 

 

      SET @PKSQL = ''

      SET @PKSQL = 'ALTER TABLE ' + @PkTable + ' ADD CONSTRAINT ' + @PkName +

 

                   ' PRIMARY KEY CLUSTERED ('

 

 

 

      -- Get all columns for the current primary key

 

      DECLARE cpkcolumn CURSOR FOR

 

        SELECT column_name

 

        FROM   information_schema.key_column_usage

 

        WHERE  table_name = @PkTable

 

               AND constraint_name = @PkName

 

        ORDER  BY ordinal_position

 

 

 

      OPEN cpkcolumn

 

 

 

      DECLARE @PkColumn SYSNAME

 

      DECLARE @PkFirstColumn BIT

 

 

 

      SET @PkFirstColumn = 1

 

 

 

      -- Loop through all columns and append the sql statement

 

      FETCH NEXT FROM cpkcolumn INTO @PkColumn

 

 

 

      WHILE ( @@FETCH_STATUS = 0 )

 

        BEGIN

 

            IF ( @PkFirstColumn = 1 )

 

              SET @PkFirstColumn = 0

 

            ELSE

 

              SET @PKSQL = @PKSQL + ', '

 

 

 

            SET @PKSQL = @PKSQL + @PkColumn

 

 

 

            FETCH NEXT FROM cpkcolumn INTO @PkColumn

 

        END

 

 

 

      CLOSE cpkcolumn

 

 

 

      DEALLOCATE cpkcolumn

 

 

 

      SET @PKSQL = @PKSQL + ')' + ' ON [' + @FileName +']'+ CHAR(13) + CHAR(10) +'GO'

 

 

 

      -- Print the primary key statement

 

      PRINT @PKSQL

 

 

 

      FETCH NEXT FROM cpk INTO @PkTable, @PkName, @FileName

 

  END

 

 

 

CLOSE cpk

DEALLOCATE cpk

 

Abs!

 

 

Nenhum comentário:

Postar um comentário

Leave your comment here!