Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Вземете списък с таблици със или без ограничение на първичен ключ във всички бази данни от екземпляр на SQL Server - SQL Server / TSQL Урок, част 61

Сценарий:

Вие работите като разработчик на 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 



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Избягвайте дублирането в заявката INSERT INTO SELECT в SQL Server

  2. Защо SQL Server губи една милисекунда?

  3. Базирани на функции индекси в SQL Server

  4. Съхранената процедура или функция очаква параметър, който не е предоставен

  5. Как да задам сортиране за връзка в SQL Server?