Таблица SQL и столбец Parser для хранимых процедур - PullRequest
5 голосов
/ 12 ноября 2008

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

Вывод должен быть как TableA Columna columnC columnD

TableB columnE columnF columnG

Я написал небольшое приложение, используя Database Edition GDR. Любой желающий может обратиться к http://tsqlparsergdr.codeplex.com

Ответы [ 6 ]

2 голосов
/ 12 ноября 2008

Не конкретное решение - но направление мысли.

Рассматривается как sysdepends в качестве потенциального решения, но, как известно, ненадежно содержит всю информацию о зависимом объекте.

а как насчет того, что получил Лекс / Як? Есть несколько коммерческих парсеров, например

http://www.sqlparser.com/download.php

Не искал реализации с открытым исходным кодом, но я думаю, что я бы искал этот маршрут. Вот как я начал свой поиск:

http://www.google.com/search?hl=en&q=sql+lex+yacc+parse

Синтаксис BNF для ANSI SQL можно найти здесь:

http://savage.net.au/SQL/

При выборе реализации lex это кажется относительно простой инженерной проблемой. (хотя и с некоторыми затруднениями, если вы хотите поддерживать расширения MS SQL)

1 голос
/ 30 августа 2010

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

1 голос
/ 19 декабря 2008

Решили создать небольшое приложение, используя Regex, чтобы удовлетворить мои текущие потребности.

Спасибо всем за ваши ответы.

1 голос
/ 19 ноября 2008

Вы можете использовать настройку SHOWPLAN_ALL и проанализировать вывод.

0 голосов
/ 19 ноября 2008

sp_depends должно помочь

0 голосов
/ 12 ноября 2008

Вы можете вызвать хранимые процедуры программно (в среде разработки) и получить получившиеся столбцы . Возможно, у вас есть соглашение об именах, чтобы избежать вызова вставки и процедуры обновления. Вам также нужно будет найти способ установить правильные параметры.

Примечание: Я думаю, что 100% надежное решение технически невозможно из-за способа работы хранимой процедуры (может).

Посмотрите на этот пример:

[...]
@MyDate datetime

AS

    IF (day(@MyDate) = 1)
    BEGIN
        SELECT * FROM MyFirstTable
        RETURN
    END

    IF (@MyDate > getdate())
        SELECT MyID, MyText FROM MySecondTable WHERE ADate > @MyDate
    ELSE
        EXEC Other_StoredProcedure @MyType, @MyDate

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

...