ResId主キーを持つメイン テーブルがあります。
ResIdは、200 以上のテーブルの外部キーです。これらのテーブルに、一意の値を持つResIdを挿入します。
たとえば、テーブル 1 のResIdは1,7,50で、テーブル 2 は3,4,21で、テーブル 3 は2,6,81などです。
メインテーブルから特定のResIdを持つテーブル名を取得するにはどうすればよいですか。
たとえば、ResId=3の場合の結果はtable2、ResId=6の場合の結果はtable3 です。
ResId主キーを持つメイン テーブルがあります。
ResIdは、200 以上のテーブルの外部キーです。これらのテーブルに、一意の値を持つResIdを挿入します。
たとえば、テーブル 1 のResIdは1,7,50で、テーブル 2 は3,4,21で、テーブル 3 は2,6,81などです。
メインテーブルから特定のResIdを持つテーブル名を取得するにはどうすればよいですか。
たとえば、ResId=3の場合の結果はtable2、ResId=6の場合の結果はtable3 です。
ロジックは次のようになります。
1) sys.tables から #temptable にすべてのテーブルの名前を挿入します。
2)必要なResIDが含まれている場合は、それぞれカーソルチェックを使用します
2a) いいえの場合、次のテーブルに移動します
2b) はいの場合、テーブル名を @result に挿入します
3) @result から名前を出力しますか?
わかりました、何かが足りないかもしれませんが、うまくいくはずです:
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」を実際のテーブル名に置き換える必要があります。