3

ResId主キーを持つメイン テーブルがあります。

ResIdは、200 以上のテーブルの外部キーです。これらのテーブルに、一意の値を持つResIdを挿入します。

たとえば、テーブル 1 のResId1,7,50で、テーブル 2 は3,4,21で、テーブル 3 は2,6,81などです。

メインテーブルから特定のResIdを持つテーブル名を取得するにはどうすればよいですか。

たとえば、ResId=3の場合の結果はtable2ResId=6の場合の結果はtable3 です。

4

3 に答える 3

0

ロジックは次のようになります。

1) sys.tables から #temptable にすべてのテーブルの名前を挿入します。

2)必要なResIDが含まれている場合は、それぞれカーソルチェックを使用します

2a) いいえの場合、次のテーブルに移動します

2b) はいの場合、テーブル名を @result に挿入します

3) @result から名前を出力しますか?

于 2013-06-18T08:22:41.220 に答える
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', @cnt=@counts 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

「Your Initial Table Name」を実際のテーブル名に置き換える必要があります。

于 2013-06-18T08:47:05.383 に答える