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!