シナリオ:
あなたはSQLServer開発者として働いています。存在しない場合は、SQLServerデータベースのすべてのテーブルのすべてのID列に主キー制約を作成する必要があるというこの要件があります。主キー名はPk_SchemaName_TableName_ColumnNameである必要があります。
解決策:
まず、ID列があり、主キー制約が作成されていないテーブルのリストを取得する必要があります。システムテーブルとシステムビューを使用して、主キー制約のないID列を持つすべてのテーブルを取得します。次に、動的SQLでCursorを使用して、テーブルのAlterステートメントを生成し、主キー制約を追加してスクリプトを実行します。
USE YourDatabaseName
GO
--Declare Variables
DECLARE @DatabaseName AS VARCHAR(128)
DECLARE @SchemaName AS VARCHAR(128)
DECLARE @TableName AS VARCHAR(128)
DECLARE @ColumnName AS VARCHAR(128)
DECLARE CUR CURSOR
FOR
--Get list of tables with Identity Column
--on which have no Primary Key
SELECT DB_Name() AS DatabaseName
,Schema_Name(Schema_id) AS TableSchema
,OBJECT_NAME(c.OBJECT_ID) AS TableName
,c.NAME AS ColumnName
FROM sys.columns c
INNER JOIN sys.tables t ON c.object_id = t.object_id
WHERE is_identity = 1
AND type_desc = 'USER_TABLE'
EXCEPT
SELECT TC.Table_Catalog AS DatabaseName
,TC.Table_Schema AS TableSchema
,TC.Table_Name AS TableName
,CCU.Column_Name AS ColumnName
FROM information_Schema.Table_Constraints TC
INNER JOIN Information_Schema.constraint_column_usage CCU ON TC.Constraint_Name = CCU.Constraint_Name
AND TC.Table_Name = CCU.Table_Name
WHERE Constraint_Type = 'PRIMARY KEY'
OPEN Cur
FETCH NEXT
FROM Cur
INTO @DatabaseName
,@SchemaName
,@TableName
,@ColumnName
WHILE @@FETCH_STATUS = 0
BEGIN
--Build dynamic sql for each database
DECLARE @SQL VARCHAR(MAX) = NULL
SET @SQL = 'Alter Table [' + @SchemaName + '].[' + @TableName + ']' + CHAR(10)
SET @SQL += 'Add Constraint [Pk_' + @SchemaName + '_' + @TableName
+ '_' + @ColumnName + '] '
SET @SQL += 'Primary Key ([' + @ColumnName + '])'
EXEC (@SQL)
PRINT @SQL
FETCH NEXT
FROM Cur
INTO @DatabaseName
,@SchemaName
,@TableName
,@ColumnName
END
CLOSE Cur
DEALLOCATE Cur 主キー制約を追加するためのalterステートメントを生成するだけの場合は、Exec(@SQL)部分にコメントを追加できます。上記のスクリプトはAlterステートメントを出力し、都合の良いときに実行できます。
また、主キー制約にスキーマ名の部分を追加したくない場合は、@ SchemaNameを削除できます。
上記のクエリを実行すると、欠落しているID列に主キー制約が作成されました。
主キー制約をID列に追加するためにスクリプトによって生成されたスクリプトを変更する確認しましたテーブルと主キー制約が正常に作成されました。
SQLServerデータベースのID列に主キー制約を作成する方法