Tình huống:
Bạn đang làm việc với tư cách là nhà phát triển SQL Server / SQL Server DBA cho công ty Bảo hiểm. Bạn đang tạo tài liệu cho các đối tượng cơ sở dữ liệu. Bạn cần lấy danh sách tất cả các bảng từ tất cả cơ sở dữ liệu từ SQL Server Instance mà không có Ràng buộc về Khóa chính.
Giải pháp:
Chúng ta có thể sử dụng dạng xem hệ thống để liệt kê các bảng có Ràng buộc Khóa Chính hoặc không từ mỗi cơ sở dữ liệu. Vì truy vấn phải chạy trên mỗi cơ sở dữ liệu để thu thập thông tin này, chúng tôi cần lặp qua danh sách cơ sở dữ liệu người dùng, chúng tôi sẽ sử dụng con trỏ để thực hiện lặp qua tất cả các cơ sở dữ liệu trên phiên bản SQL Server. Chúng tôi sẽ xây dựng sql động của chúng tôi cho từng cơ sở dữ liệu và lưu kết quả vào bảng tạm thời và cuối cùng chúng tôi sẽ chọn các bản ghi để hiển thị.
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
Tôi thực hiện truy vấn ở trên trên phiên bản SQL Server của mình và đây là danh sách các bảng từ tất cả các cơ sở dữ liệu có ràng buộc Khóa chính nếu có sẵn Null. Cách lấy tất cả các bảng có hoặc không có Ràng buộc khóa chính trong tất cả cơ sở dữ liệu từ SQL Server Instance-SQL Server / Hướng dẫn TSQL