シナリオ:
あなたは保険会社のSQLServer開発者/SQLServerDBAとして働いています。データベースオブジェクトのドキュメントを作成しています。主キーの制約なしで、SQLServerインスタンスのすべてのデータベースからすべてのテーブルのリストを取得する必要があります。
解決策:
システムビューを使用して、各データベースからの主キー制約のあるテーブルまたはないテーブルのリストを作成できます。この情報を収集するには各データベースでクエリを実行する必要があるため、ユーザーデータベースのリストをループする必要があります。カーソルを使用して、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)
,HasPrimaryKeyConstraint VARCHAR(10)
)
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,
T.Table_Catalog as DatabaseName,
T.Table_Schema AS TableSchema,
T.Table_Name AS TableName,
CCU.Column_Name AS ColumnName,
TC.Constraint_Name AS ConstraintName,
Case When TC.Constraint_Name is not Null Then ''Yes''
Else ''No'' End as HasPrimaryKeyConstraint
From
' + @DatabaseName + '.information_schema.tables T
left join
' + @DatabaseName + '.information_Schema.Table_Constraints TC
on T.Table_Catalog=TC.Table_Catalog
and T.Table_Schema=TC.Table_Schema
and T.Table_Name=TC.Table_Name
and TC.Constraint_Type=''PRIMARY KEY''
left JOIN
' + @DatabaseName +
'.Information_Schema.constraint_column_usage CCU
on TC.Constraint_Name=CCU.Constraint_Name
and TC.Table_Name=CCU.Table_Name
and T.Table_Type=''BASE TABLE'''
EXEC (@SQL)
PRINT @SQL
FETCH NEXT
FROM Cur
INTO @DatabaseName
END
CLOSE Cur
DEALLOCATE Cur
--Select all records from temp table
SELECT *
FROM #Results
SQL Serverインスタンスで上記のクエリを実行します。これは、利用可能な場合は主キー制約があり、それ以外の場合はNullであるすべてのデータベースのテーブルのリストです。 SQLServerインスタンスからすべてのデータベースで主キー制約の有無にかかわらずすべてのテーブルを取得する方法-SQLServer /TSQLチュートリアル