sql >> Databasteknik >  >> RDS >> Sqlserver

Hur man får en lista över tabeller utan primärnyckelbegränsning i alla databaser av SQL Server-instanser - SQL Server / TSQL Tutorial Del 62

Scenario:

Du arbetar som SQL Server-utvecklare eller SQL Server DBA. Du måste få listan över alla tabeller från alla databaser på SQL Server-instansen som inte har primära nyckelbegränsningar. Hur skulle du göra det?


Lösning:

Vi kommer att använda systemvyer för att hämta alla tabeller från alla databaser på SQL Server Instance som inte har primära nyckelbegränsningar.
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)
    )
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,
   Table_CataLog as DatabaseName,
   Table_Schema as TableSchema,
   Table_Name as TableName      
from
   '+@DatabaseName+'.information_schema.tables T     
where
   Not Exists(
      Select
         1 
      from
         '+@DatabaseName+'.information_Schema.Table_Constraints C     
      where
         Constraint_Type=''PRIMARY KEY''     
         and C.Table_Name=T.Table_Name     
         and C.Table_Schema=T.Table_Schema
   )     
   and 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
 
 Jag körde ovanstående fråga på min SQL Server-instans och fick en lista över tabeller från alla databaser som inte har primära nyckelbegränsningar.

Hämta alla tabeller från SQL Server Instance som inte har Primary Key Constraint - SQL Server / Handledning för TSQL
  1. Concat det andra kolumnvärdet om det första kolumnvärdet är detsamma

  2. SQL DELETE med INNER JOIN

  3. Hibernate, Postgresql:Kolumn x är av typen oid men uttrycket är av typen byte

  4. GROUP BY för att kombinera/konkatera en kolumn