シナリオ:
データベースオブジェクトのドキュメント化に取り組んでおり、SQLServerインスタンス全体のすべてのデータベーステーブルに対するすべての主キー制約のリストを提供するように求められます。データベース名、スキーマ名、テーブル名、列名、制約名を含むすべての主キー制約のリストをどのように提供しますか?解決策:
システムビューを使用して、主キー制約情報を取得します。すべてのデータベースでクエリを実行する必要があるため、動的SQLでカーソルを使用します。データベースごとに、結果を一時テーブルに挿入し、最後に一時テーブルから結果を選択して表示します。USE master
GO
--Declare Variables
DECLARE @DatabaseName AS VARCHAR(500)
--Create Temp Table to Save Results
IF OBJECT_ID('tempdb..#Results') IS NOT NULL
DROP TABLE #Results
CREATE TABLE #Results (
ServerName VARCHAR(128)
,DatabaseName VARCHAR(128)
,SchemaName VARCHAR(128)
,TableName VARCHAR(128)
,ColumnName VARCHAR(128)
,ConstraintName VARCHAR(128)
)
DECLARE CUR CURSOR
FOR
SELECT '[' + NAME + ']' AS DBName
FROM sys.databases
WHERE NAME NOT IN (
'master'
,'tempdb'
,'model'
,'msdb'
)
OPEN Cur
FETCH NEXT
FROM Cur
INTO @DatabaseName
WHILE @@FETCH_STATUS = 0
BEGIN
--Build dynamic sql for each database
DECLARE @SQL VARCHAR(MAX) = NULL
SET @SQL = 'Insert into #Results
Select
@@ServerName,
TC.Table_Catalog as DatabaseName,
TC.Table_Schema AS TableSchema,
TC.Table_Name AS TableName,
CCU.Column_Name AS ColumnName,
TC.Constraint_Name AS ConstraintName
From' + @DatabaseName + '.information_Schema.Table_Constraints TC
INNER JOIN
' + @DatabaseName + '.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'''
EXEC (@SQL)
PRINT @SQL
FETCH NEXT
FROM Cur
INTO @DatabaseName
END
CLOSE Cur
DEALLOCATE Cur
--Select all records from temp table for Primary Key --Constraint Information
SELECT * FROM #Results
SQL Serverインスタンスで上記のクエリを実行すると、以下に示すように、データベース名、スキーマ名、テーブル名、列名、および制約名を含むすべての主キー制約のリストが取得されます。
SQLServerインスタンスから各データベースのすべての主キー制約のリストを取得する方法-SQLServer /T-SQLチュートリアル