sql >> Databáze >  >> RDS >> Sqlserver

Získejte seznam tabulek s omezením primárního klíče nebo bez něj ve všech databázích z instance SQL Server - SQL Server / Výukový program TSQL, část 61

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 



  1. Funkce NLS_COLLATION_ID() v Oracle

  2. Výběr hodnot z proměnné tabulky Oracle / pole?

  3. SQL Server - Jak uzamknout tabulku, dokud neskončí uložená procedura

  4. Získejte velikost všech databází v PostgreSQL (psql)