2013-06-18 1 views
3

У меня есть основная таблица с ResId первичный ключ.Получить табличное имя отношения между таблицами с уникальным внешним ключом

ResId является иностранным ключом для более чем 200 таблиц. В этих таблицах вставьте ResId с уникальным значением.

Например RESID в table1 является 1,7,50 и table2 является 3,4,21 и Таблица3 является 2,6,81 ...

Как может Я получаю имя таблицы с конкретным ResId из основного стола.

Например, когда RESID = 3 Результат table2 и когда RESID = 6 результат Таблица3

ответ

1
Declare @ResourceWorkflowID Int = 8019--For Example 
Declare @Temp Table 
(
    TblName Varchar(100), 
    RowNum Int Identity(1,1) 
) 
Insert Into @Temp 
    Select Distinct Object_Name(F.Parent_Object_Id) AS TableName 
    From Sys.Foreign_Keys AS F 
    Inner Join Sys.Foreign_Key_Columns As Fc On F.Object_Id = Fc.Constraint_Object_Id 
     Where Col_Name(Fc.Parent_Object_Id, Fc.Parent_Column_Id) = 'ResourceWorkflowID' 
Declare @Counter Int = 1, @State Int = 0 
While(@Counter <= (Select Max(RowNum) From @Temp) And @State = 0) 
Begin 
    Declare @Str nVarchar(400) = '', @Name nVarchar(50) = '' 
    Select @Name = TblName From @Temp Where RowNum = @Counter 
    Set @Str = 'If Exists (Select ResourceWorkflowID From '[email protected]+' Where ResourceWorkflowID = '+Cast(@ResourceWorkflowID As Nvarchar(10))+') 
     Set @Cnt = ' + Cast(@Counter As Nvarchar(2)) 
    Exec Sp_ExecuteSql @Str,N'@Cnt Int Output', @[email protected] Output 
    Set @Counter += 1 
End 
Select TblName As TableName From @Temp Where RowNum = @State 
Go 
0

логика может быть следующее:

1) вставить все таблицы имена в #temptable из sys.tables

2) с помощью курсора проверьте каждый, если он содержит необходимые данные. ResID

2а), если перейти к следующей таблице

2b) Если да вставить имя таблицы не @result

3) Название Печать из @result?

0

Хорошо, возможно я что-то пропустил, но я думаю, что должно работать:

CREATE FUNCTION dbo.GetForeignTableNameByID 
( 
    @id INT 
) 
RETURNS NVARCHAR(MAX) 
AS 
BEGIN 
    DECLARE @table_id INT; 
    DECLARE @table_name NVARCHAR(MAX); 
    DECLARE @sql NVARCHAR(MAX); 
    DECLARE @counts INT; 

    DECLARE tables_cursor CURSOR FOR 
    SELECT 
     FK.referenced_object_id 
    FROM 
     sys.foreign_key_columns as FK   
    WHERE 
     FK.parent_object_id = OBJECT_ID('<Your Initial Table Name>'); 

    OPEN tables_cursor; 

    FETCH NEXT FROM tables_cursor 
    INTO @table_id; 

    WHILE @@FETCH_STATUS = 0 
    BEGIN 

     SET @table_name = 
     (
      SELECT QUOTENAME(DB_NAME(database_id)) 
       + N'.' 
       + QUOTENAME(OBJECT_SCHEMA_NAME(object_id, database_id)) 
       + N'.' 
       + QUOTENAME(OBJECT_NAME(object_id, database_id)) AS TableName 
      FROM sys.dm_db_index_operational_stats(null, null, null, null) 
      WHERE object_id = @table_id 
     ); 

     IF @table_name != '' 
     BEGIN 

      SET @sql = 'SELECT @cnt = COUNT(*) FROM ' + @table_name + ' WHERE ResId = ' + CAST(@id AS NVARCHAR(MAX)); 

      EXECUTE sp_executesql @sql, N'@cnt int OUTPUT', @[email protected] OUTPUT           

      IF @counts > 0 
       RETURN @table_name 
     END; 

     FETCH NEXT FROM tables_cursor 
     INTO @table_id; 
    END; 

    CLOSE tables_cursor; 
    DEALLOCATE tables_cursor; 
    RETURN ''; 
END 
GO 

Вы должны заменить «при первичной таблицы Имя» с действительным именем таблицы.

Смежные вопросы