Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Uzyskaj listę tabel z lub bez ograniczenia klucza podstawowego we wszystkich bazach danych z wystąpienia programu SQL Server — samouczek SQL Server / TSQL, część 61

Scenariusz:

Pracujesz jako programista SQL Server / SQL Server DBA dla firmy ubezpieczeniowej. Tworzysz dokumentację obiektów bazy danych. Musisz pobrać listę wszystkich tabel z całej bazy danych z wystąpienia SQL Server bez ograniczeń dotyczących klucza podstawowego.


Rozwiązanie:

Możemy użyć widoków systemowych, aby wyświetlić listę tabel z ograniczeniem klucza podstawowego lub nie z każdej bazy danych. Ponieważ zapytanie musi zostać uruchomione w każdej bazie danych, aby zebrać te informacje, musimy przejść przez listę baz danych użytkowników, będziemy używać kursora do wykonywania pętli przez wszystkie bazy danych na instancji SQL Server. Zbudujemy nasz dynamiczny sql dla każdej bazy danych i zapiszemy wyniki w tabeli tymczasowej, a na koniec wybierzemy rekordy do wyświetlenia.
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
 
 
 Wykonuję powyższe zapytanie na mojej instancji SQL Server i tutaj znajduje się lista tabel ze wszystkich baz danych z ograniczeniem klucza podstawowego, jeśli jest dostępny w innym przypadku Null. Jak pobrać wszystkie tabele z ograniczeniem klucza podstawowego lub bez niego we wszystkich bazach danych z wystąpienia SQL Server — SQL Server / Samouczek TSQL 



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 10 wskazówek SP_EXECUTESQL, których należy unikać, aby uzyskać lepszy dynamiczny SQL

  2. lista rozdzielana przecinkami jako pojedynczy ciąg, T-SQL

  3. Instalacja klastra pracy awaryjnej serwera SQL -3

  4. SQL Server:odpowiednik kaskadowej tabeli upuszczania?

  5. Konwertuj tekst pola tekstowego na liczbę całkowitą