Найти список таблиц внутри запроса Dynami c - PullRequest
0 голосов
/ 02 мая 2020

Я sh, чтобы найти список таблиц в динамическом c запросе внутри хранимых процедур (а их довольно много). Как я могу их найти?

Дополнение к требованию: необходимо извлечь имя базы данных также вместе с именем таблицы.

Ниже приведен пример хранимой процедуры и запрос для поиска таблиц внутри хранимой процедуры. Запрос не возвращает никаких результатов.

Обратите внимание, что я не могу изменить хранимую процедуру как устаревший код.

Администратор моей компании подтвердил, что мы не можем использовать сценарии powershell /.NET в качестве базы данных для разработки / Prod находятся в сети клиента, и это нарушит его политику безопасности.

CREATE OR ALTER PROCEDURE dbo.FindTablesInsideDynamicQuery (@companyID int)
as 
begin
DECLARE @dynamicSQL TABLE (id int identity(1,1), line varchar(max))

    insert into @dynamicSQL(line)
    select 'delete from MCQ.dbo.table1 where companyid = ' + Convert(varchar, @CompanyID) +';'
    union
    select 'delete from MCQ.dbo.Shares where companyid = ' + Convert(varchar, @CompanyID) +';'
    union
    select 'delete from MCQ.dbo.ExtremeGames where companyid = ' + Convert(varchar, @CompanyID) +';'
    union
    select 'delete from MCQ.dbo.Earning where companyid = ' + Convert(varchar, @CompanyID) +';'
    union
    select 'delete from MCQ.dbo.Fortress where companyid = ' + Convert(varchar, @CompanyID) +';'
    union
    select 'delete from MCQ.dbo.BlackScholes where companyid = ' + Convert(varchar, @CompanyID) +';' 
end 
GO

declare @spName varchar(100) = 'FindTablesInsideDynamicQuery'

SELECT distinct
referencing_schema_name = SCHEMA_NAME(o.SCHEMA_ID),
referencing_object_name = o.name,
referenced_object_name = referenced_entity_name,
referenced_object_type_desc = o1.type_desc,
referenced_server_name, referenced_database_name
FROM
sys.sql_expression_dependencies sed
INNER JOIN sys.objects o ON sed.referencing_id = o.[object_id]
LEFT OUTER JOIN
sys.objects o1 ON sed.referenced_id = o1.[object_id]
where o.name =  @spName

1 Ответ

0 голосов
/ 02 мая 2020

Вы можете использовать sys.sql_modules для извлечения подробностей таблицы из динамических c SQL в хранимых процедурах.

Попробуйте выполнить следующее:

DECLARE @spName VARCHAR(100)= 'FindTablesInsideDynamicQuery';
DECLARE @objects_used VARCHAR(MAX)= '';
DECLARE @str VARCHAR(MAX)=
(
    SELECT definition
    FROM sys.sql_modules
    WHERE definition LIKE '%' + @spName + '%'
);
WHILE((PATINDEX('%[.][a-z][a-z][a-z][.]%', @str)) > 0)
    BEGIN
        SET @str = SUBSTRING(@str, LEN(@str) - (CHARINDEX(' ', REVERSE(@str), LEN(@str) - (PATINDEX('%[.][a-z][a-z][a-z][.]%', @str))) - 1), LEN(@str));
        SET @objects_used+=SUBSTRING(@str, 1,CASE WHEN CHARINDEX(' ', LTRIM(RTRIM(@STR)), 1) > 0 THEN CHARINDEX(' ', LTRIM(RTRIM(@STR)), 1) ELSE LEN(@STR) END);
        SET @str = SUBSTRING(@str, (PATINDEX('%[.][a-z][a-z][a-z][.]%', @str) + 1), LEN(@str));
    END;
SELECT value FROM STRING_SPLIT(LTRIM(RTRIM(@objects_used)), ' ');

В приведенном выше сценарии предполагается, что имя схемы состоит из трех символов в процедуре.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...