0

特定の SQL クエリで使用されるすべてのフィールド (理想的にはテーブルの詳細を含む) のリストを返すことができるようにしたいと考えています。たとえば、クエリの入力:

SELECT t1.field1, field3
FROM dbo.table1 AS t1
INNER JOIN dbo.table2 as t2
    ON t2.field2 = t1.field2
WHERE t2.field1 = 'someValue'

戻るだろう

+--------+-----------+--------+
| schema | tablename | field  |
+--------+-----------+--------+
| dbo    | table1    | field1 |
| dbo    | table1    | field2 |
| dbo    | table1    | field3 |
| dbo    | table2    | field1 |
| dbo    | table2    | field2 |
+--------+-----------+--------+

フィールド 3 がテーブル 2 ではなくテーブル 1 にあることをリーダーが知る方法がないため、実際には SQL カーネル (正しい言葉ですか? エンジン?) を使用する必要があります。このため、解決策はSQLになると思います。それも処理できればボーナスポイントSELECT *

sqlparse ( https://sqlparse.readthedocs.io/en/latest/ ) を使用して Python ソリューションを試みましたが、一時テーブル、サブクエリ、および CTE を含むより複雑な SQL クエリに問題がありました。また、エイリアスの処理も非常に困難でした (特にクエリが複数の場所で同じエイリアスを使用した場合)。明らかにfield3、テーブル識別子がない上記のようなケースを処理できませんでした。また、それを処理することもできませんSELECT *

私は、SQL Server Management Studio 内に、または SQL Server 自体内に何らかの機能を備えた、より洗練されたソリューションがあることを望んでいました。Redgate の SQL Prompt があります。これは、その IntelliSense 内で、フォーマットしているアーキテクチャと SQL クエリをある程度理解している必要があります。

更新: 要求どおり: 私がこれを実行しようとしている理由はUsers、組織内でどの SSRS レポートを実行できるかを判断するためです。これは、特定のレポートのすべてのデータセット (この場合は SQL クエリ) で使用されるすべてのフィールドにGRANT SELECT権限が割り当てられているかどうかに完全に依存しています。私はRolesすでに、彼らの. 私は今、それらの権限が実行を許可するレポートにそれを拡張したいと考えています。UsersGRANT SELECTRoles

4

2 に答える 2

1

列名はあいまいであるか、派生する可能性があるため、列テーブル名は扱いにくい場合があります。ただし、事実上すべてのクエリまたはストアド プロシージャから列名、シーケンス、および型を取得できます。

Select column_ordinal
      ,name
      ,system_type_name 
  From sys.dm_exec_describe_first_result_set('Select * from YourTable',null,null )  
于 2020-02-26T16:48:24.400 に答える