Как получить список таблиц, используемых в каком-либо конкретном запросе в SQL Server? - PullRequest
2 голосов
/ 30 октября 2019

Мне нужна помощь в получении списка всех таблиц, используемых в любом конкретном запросе в SQL Server, будь то его часть соединения или любой подзапрос.

Я ожидаю вывод, как показано ниже.

Допустим,query is-> "select A. *, B.col1, B.col2 из таблицы1 Таблица внутреннего соединения2 B для A.abc = b.abc"

Ожидаемый результат - список таблицы, использованной в приведенном выше запросе. это table1, table2

Можно ли как-нибудь получить таблицы, используемые для любого случайного запроса?

-----------------------------------------------------------

Спасибо всем -Я понял, что это работает для SQL Server. Я ищу то же самое для Netezza.

Есть ли какой-нибудь эквивалент для sys.dm_exec_describe_first_result_set в Netezza, который может обеспечить такие же результаты?

1 Ответ

1 голос
/ 31 октября 2019

Вы можете поместить свой запрос в хранимую процедуру (например, sp_Dummy), затем вы можете получить зависимости с помощью

SELECT DISTINCT 
     o.name 
    ,o.type_desc 
FROM sys.dm_sql_referenced_entities(QUOTENAME(N'dbo') + N'.' +  QUOTENAME(N'sp_Dummy'), 'OBJECT') AS dm 

INNER JOIN sys.objects AS o 
    ON o.object_id = dm.referenced_id 

INNER JOIN sys.schemas AS sch 
    ON sch.schema_id = o.schema_id 

Здесь оболочка процедуры

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[sp_Dummy]') AND type in (N'P', N'PC'))
BEGIN
EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE [dbo].[sp_Dummy] AS' 
END
GO


-- =======================================================
-- Author:      XXXX
-- Create date: 31.10.2019
-- Description: Dummy procedure to infer dependencies
-- =======================================================
ALTER PROCEDURE [dbo].[sp_Dummy]
     @in_object_type AS varchar(2) 
    ,@in_object_uid AS uniqueidentifier 
    ,@in_report_date AS datetime2 
    -- your query's parameters go here...
AS
BEGIN
    SET NOCOUNT ON;

    -- your query goes here
END


GO

Это выиграно 'Хотя я не получаю динамический sql - но я думаю, что это настолько хорошо, насколько это возможно.

Вы можете извлечь все параметры с помощью:

System.Text.RegularExpressions.Regex.Matches(sql, @"\@\w+")
    .Cast<Match>().Select(m => m.Value).ToList();
...