2013-08-06 26 views
5

Tôi có bảng A bằng khóa chính trên cột ID và các bảng B,C,D... có 1 hoặc nhiều cột có mối quan hệ khóa ngoài với A.ID.SQL làm cách nào để bạn truy vấn các bảng tham chiếu đến một giá trị khóa ngoài cụ thể?

Làm cách nào để viết truy vấn hiển thị cho tôi tất cả các bảng chứa giá trị cụ thể (ví dụ: 17) của khóa chính?

Tôi muốn có mã sql chung có thể lấy tên bảng và giá trị khóa chính và hiển thị tất cả các bảng tham chiếu giá trị cụ thể đó thông qua khóa ngoại.

Kết quả phải là danh sách tên bảng.

Tôi đang sử dụng MS SQL 2012.

+0

Vì vậy, bạn đang tìm kiếm một sơ đồ ERD? – Elias

+0

RDBMS là gì? Các mối quan hệ FK có thực sự được xác định trong thông số 'CREATE TABLE' hay chỉ theo giá trị? –

+0

Có các mối quan hệ FK hiện có. Tôi không tìm kiếm một sơ đồ, tôi đang tìm các bảng có thể ngăn chặn việc xóa hàng trong bảng PK do mối quan hệ FK hiện có. – CoderBrien

Trả lời

1

Không phải là một lý tưởng, nhưng phải trả lại những gì cần thiết (danh sách các bảng):

declare @tableName sysname, @value sql_variant 

set @tableName = 'A' 
set @value = 17 

declare @sql nvarchar(max) 

create table #Value (Value sql_variant) 
insert into #Value values (@value) 

create table #Tables (Name sysname, [Column] sysname) 
create index IX_Tables_Name on #Tables (Name) 

set @sql = 'declare @value sql_variant 
select @value = Value from #Value 

' 
set @sql = @sql + replace((
select 
    'insert into #Tables (Name, [Column]) 
select ''' + quotename(S.name) + '.' + quotename(T.name) + ''', ''' + quotename(FC.name) + ''' 
where exists (select 1 from ' + quotename(S.name) + '.' + quotename(T.name) + ' where ' + quotename(FC.name) + ' = @value) 
' 
from 
    sys.columns C 
    join sys.foreign_key_columns FKC on FKC.referenced_column_id = C.column_id and FKC.referenced_object_id = C.object_id 
    join sys.columns FC on FC.object_id = FKC.parent_object_id and FC.column_id = FKC.parent_column_id 
    join sys.tables T on T.object_id = FKC.parent_object_id 
    join sys.schemas S on S.schema_id = T.schema_id 
where 
    C.object_id = object_id(@tableName) 
    and C.name = 'ID' 
order by S.name, T.name 
for xml path('')), '
', CHAR(13)) 

--print @sql 
exec(@sql) 

select distinct Name 
from #Tables 
order by Name 

drop table #Value 
drop table #Tables 
3

Bạn muốn nhìn vào sys.foreignkeys. Tôi sẽ bắt đầu từ http://blog.sqlauthority.com/2009/02/26/sql-server-2008-find-relationship-of-foreign-key-and-primary-key-using-t-sql-find-tables-with-foreign-key-constraint-in-database/

để cung cấp cho một cái gì đó giống như

declare @value nvarchar(20) = '1' 

SELECT 
    'select * from ' 

    + QUOTENAME(SCHEMA_NAME(f.SCHEMA_ID)) 
    + '.' 
    + quotename(OBJECT_NAME(f.parent_object_id)) 
    + ' where ' 
    + COL_NAME(fc.parent_object_id,fc.parent_column_id) 
    + ' = ' 
    + @value 

FROM sys.foreign_keys AS f 
INNER JOIN sys.foreign_key_columns AS fc ON f.OBJECT_ID = fc.constraint_object_id 
INNER JOIN sys.objects AS o ON o.OBJECT_ID = fc.referenced_object_id 
+0

Đối với các khóa chính của chuỗi, cách thức hoạt động của thoát? Hãy nói rằng bạn là một thủ tục lưu trữ nhận @value như một tham số và "biết" rằng đó là một varchar. – xanatos

+0

Nếu bạn có các khóa chính của chuỗi, hoặc các guids, bạn có thể làm cho sql xử lý tất cả các khóa dưới dạng chuỗi và cho phép nó chuyển đổi hoàn toàn thành ints, v.v., nếu thích hợp. – podiluska

0

Bạn có thể đạt được điều đó bằng cách viết một số lệnh SQL. Tôi đăng một ví dụ nhưng nó chỉ là một mockup cho thấy cách bạn có thể làm điều đó.

CREATE TABLE tempTable 
(
    TABLE_NAME varchar(255) 
); 

CREATE UNIQUE CLUSTERED INDEX Idx_tempTable ON tempTable(TABLE_NAME); 

DECLARE @var2 nvarchar(max) 

INSERT INTO tempTable 
     SELECT DISTINCT 
       TABLE_NAME 
     FROM INFORMATION_SCHEMA.COLUMNS 
     WHERE COLUMN_NAME LIKE '%COLUMN_NAME%' 

/*FOREACH result of the tempTable you could find if the COLUMN_NAME of the result(table) has the value you want*/ 

SET @var2 = 'SELECT TABLE_NAME FROM ' + tempTableResult + ' WHERE COLUMN_NAME=VALUE' 

exec(@var2) 

DROP TABLE tempTable 
Các vấn đề liên quan