Scénář:
Pracujete jako SQL Server developer / SQL Server DBA pro pojišťovací společnost. Vytváříte dokumentaci pro databázové objekty. Potřebujete získat seznam všech tabulek z celé databáze z instance SQL Server bez omezení primárního klíče.
Řešení:
Můžeme použít systémové pohledy k zobrazení seznamu tabulek s omezením primárního klíče nebo ne z každé databáze. Vzhledem k tomu, že dotaz musí běžet na každé databázi, aby se shromáždily tyto informace, musíme procházet seznamem uživatelských databází, budeme používat kurzor k provádění smyčky přes všechny databáze na instanci SQL Server. Vytvoříme náš dynamický sql pro každou databázi a uložíme výsledky do dočasné tabulky a nakonec vybereme záznamy pro zobrazení.
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
Provádím výše uvedený dotaz na mé instanci SQL Server a zde je seznam tabulek ze všech databází s omezením primárního klíče, pokud je k dispozici jinak Null.
Jak získat všechny tabulky s omezením primárního klíče nebo bez něj v celé databázi z instance SQL Server – SQL Server / Výukový program TSQL