web-dev-qa-db-ja.com

sys.dm_sql_referenced_entitiesは、一時テーブルと結合するときに使用される列のリストを提供できません

アイデアが足りなくなったら、助けが必要だと思います。

私のデータベースには、次のような単純なテーブルがあります。

CREATE TABLE dbo.Invoices 
( 
        CashDiscounts MONEY, 
        Cost MONEY 
) 
GO 

このテーブルをSELECTコンテキストで使用するストアドプロシージャ:

CREATE PROCEDURE Reporting.pLoadTest 
AS 
BEGIN 
        CREATE TABLE #t ( Test INT ); 

        SELECT  
                  Invoice.[CashDiscounts]       AS [CashDiscounts] 
                , Invoice.[Cost]                        AS [Cost] 
        FROM dbo.Invoices AS Invoice 
        LEFT OUTER JOIN #t -- if you remove this join, dm_sql_referenced_entities should return also CashDiscounts and Cost attributes
        ON 1=1 

END 
GO

今、私が得た問題は次のとおりです:システム関数sys.dm_sql_referenced_entitiesを使用して、Reporting.pLoadTest。によって使用される列のリストを取得しています

SELECT * 
FROM sys.dm_sql_referenced_entities ('Reporting.pLoadTest', 'OBJECT') 

この関数の結果は次のようになるはずです。

  1. dbo.Invoices
  2. dbo.Invoices.CashDiscounts
  3. dbo.Invoices.Cost

ただし、temp #tテーブル関数に結合するとsys.dm_sql_referenced_entitiesが返すのは

  1. dbo.Invoices

一時テーブルではなくテーブル変数を使用すると、この場合のすべてが正常に機能します。ドキュメントに書かれているtempdbの権限をいじってみました

Sys.dm_sql_referenced_entitiesに対するSELECT権限と、参照元エンティティに対するVIEW DEFINITION権限が必要です。

しかし、肯定的な結果はありません。

一時テーブルへの選択と結合を行うストアドプロシージャで使用されている列の正しい結果を取得するにはどうすればよいですか?

6
Rafal Krajewski

これはSQL Serverのバグであり、変更が必要な場合に投票するためのConnectアイテムがあります。

一時テーブルがステートメントで使用されている場合、dm_sql_referenced_entitiesは列を表示しません

現在の状態:

この提案に対応する可能性は低いと考えているため、「修正しない」と締めくくります。

6
Mikael Eriksson

答えてくれてありがとう。ここに質問を投稿する直前に、Microsoft Connectバグリストを検索しましたが、ここでは何も見つかりませんでした。また、キーワードとしてdm_sql_referenced_entitiesを使用しました。同じバグを投稿しました https://connect.Microsoft.com/SQLServer/feedback/details/1859356 で入手できます。

それについてのマイクロソフトのポリシーを理解しているとしましょう。ただし、少なくともSQL Serverのローカルインスタンスでsys.dm_sql_referenced_entities関数を変更し、おそらく修正する方法があるのでしょうか。

0
Rafal Krajewski