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 #ResultsPrová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