Сценарий:
Вие работите като разработчик на SQL Server / SQL Server DBA за застрахователна компания. Създавате документация за обекти на база данни. Трябва да получите списък с всички таблици от цялата база данни от SQL Server Instance без ограничения на първичния ключ.
Решение:
Можем да използваме системни изгледи за списък с таблици с ограничение на първичен ключ или не от всяка база данни. Тъй като заявката трябва да се изпълнява във всяка база данни, за да събере тази информация, трябва да преминем през списък с потребителски бази данни, ще използваме курсора, за да извършим цикъл през всички бази данни на екземпляр на SQL Server. Ще изградим нашия динамичен 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.
Как да получите всички таблици със или без ограничение на първичен ключ във цялата база данни от екземпляр на SQL Server- SQL Server / Урок за TSQL