アイデアが足りなくなったら、助けが必要だと思います。
私のデータベースには、次のような単純なテーブルがあります。
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')
この関数の結果は次のようになるはずです。
ただし、temp #tテーブル関数に結合するとsys.dm_sql_referenced_entitiesが返すのは
一時テーブルではなくテーブル変数を使用すると、この場合のすべてが正常に機能します。ドキュメントに書かれているtempdbの権限をいじってみました
Sys.dm_sql_referenced_entitiesに対するSELECT権限と、参照元エンティティに対するVIEW DEFINITION権限が必要です。
しかし、肯定的な結果はありません。
一時テーブルへの選択と結合を行うストアドプロシージャで使用されている列の正しい結果を取得するにはどうすればよいですか?
これはSQL Serverのバグであり、変更が必要な場合に投票するためのConnectアイテムがあります。
一時テーブルがステートメントで使用されている場合、dm_sql_referenced_entitiesは列を表示しません
現在の状態:
この提案に対応する可能性は低いと考えているため、「修正しない」と締めくくります。
答えてくれてありがとう。ここに質問を投稿する直前に、Microsoft Connectバグリストを検索しましたが、ここでは何も見つかりませんでした。また、キーワードとしてdm_sql_referenced_entitiesを使用しました。同じバグを投稿しました https://connect.Microsoft.com/SQLServer/feedback/details/1859356 で入手できます。
それについてのマイクロソフトのポリシーを理解しているとしましょう。ただし、少なくともSQL Serverのローカルインスタンスでsys.dm_sql_referenced_entities関数を変更し、おそらく修正する方法があるのでしょうか。