powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как определить наличие двух SELECT в процедурах БД?
25 сообщений из 31, страница 1 из 2
Как определить наличие двух SELECT в процедурах БД?
    #40011911
Молодой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Требуется найти в БД все процедуры, в которых есть два и более выходных дата сета.
То есть, в теле процедуры есть более одной конструкции вида
Код: sql
1.
SELECT 1 AS N 


или
Код: sql
1.
SELECT N FROM T



Пробовал анализ поля TXT из запроса:
Код: sql
1.
2.
3.
SELECT O.name,   OBJECT_DEFINITION(O.object_id) AS TXT
FROM sys.objects O
WHERE   type IN (N'P', N'PC')  




и уперся в необходимость исключения трудно анализируемой кучи вариаций вроде

Код: sql
1.
2.
3.
4.
SELECT @N = N FROM T 
INSERT T (N) SELECT 1 AS N 
SELECT 1 AS N UNION SELECT 2 AS N 
SELECT TOP 1 @N = N FROM T


и им подобных

Вопросы:
1) Возможно кто то решал уже подобную проблему и есть готовый анализатор?
2) Существует кроме анализа текстов способ определения наличия двух селектов в процедуре?
...
Рейтинг: 0 / 0
Как определить наличие двух SELECT в процедурах БД?
    #40011920
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Никак, ибо количество резалтсетов может зависит о входных параметров.
Сколько резалтсетов в процедуре вида?


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
create proc dbo.p
@p int 
as


if @p = 1 
 select 1 as a


if @p = 2 
  select 2 as a


if @p < 3
  select 3 as a
 
...
Рейтинг: 0 / 0
Как определить наличие двух SELECT в процедурах БД?
    #40011922
Молодой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Точно, точно!

Такие конструкции

Код: sql
1.
2.
if @p = 1 
 select 1 as a



тоже надо анализировать.

Вопрос получается сводится к тому - есть ли у кого то какие то наработки по анализу текстов?
...
Рейтинг: 0 / 0
Как определить наличие двух SELECT в процедурах БД?
    #40011923
L_argo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Переберите в цикле все процедуры и всё.....
...
Рейтинг: 0 / 0
Как определить наличие двух SELECT в процедурах БД?
    #40011926
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Молодой,

И чтобы совсем жизнь малиной не казалась
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
create procedure dropme_p @n bigint
as
begin
    declare @i bigint = 0;
    while @i < @n
    begin
        select @i as d;
        set @i = @i + 1;
    end;
end;
go

exec dropme_p 8;
...
Рейтинг: 0 / 0
Как определить наличие двух SELECT в процедурах БД?
    #40011935
Молодой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Re: "И чтобы совсем жизнь малиной не казалась"

Задача не полностью автоматизировать этот процесс поиска, а просто получить единовременно
точный список процедур кандидатов, плюс чтобы он был полный и максимально сокращенный.

Потому, для начала, все тексты процедур приведу к единому формату -
по одному пробелу, tab и переводу строки где надо.
А потом запросами типа

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
 SELECT *  ,  LEN(TXT) -  LEN(REPLACE (TXT, 'SELECT', '')) as n
 FROM (
 --------------------------------------------
 SELECT O.name, (O.object_id) AS OD,  -- Трем в текстах SELECT - исключения:
  REPLACE (
 REPLACE (
 REPLACE (
 REPLACE (
 REPLACE (
 REPLACE ( 
 OBJECT_DEFINITION(O.object_id)
 ,'SELECT @', '')
 ,'SELECT TOP 1 @','')  
 ,'(SELECT','')
 ,'FOR SELECT','')
 ,'UNION' + CHAR(10)+ 'SELECT','') 
    ,'--' + CHAR(10)+ 'SELECT','') 
AS TXT
FROM sys.objects O
WHERE   type IN (N'P', N'PC') 
--------------------------------------------
) t
WHERE  LEN(TXT) -  LEN(REPLACE (TXT, 'SELECT', '')) > 6  -- Смотрим где более 2-х SELECT осталось



Сокращу список для ручного анализа
...
Рейтинг: 0 / 0
Как определить наличие двух SELECT в процедурах БД?
    #40011938
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Молодой,

вы не учитываете фактор наличия динамического SQL, который почти 100% сводит все ваши потуги на нет.

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

наиболее точный вариант будет только с реальным вызовом процедур в какой то CLR обертке вида:

1)получить список хранимок
2) для каждой хранимки:
3) выделить обязетельные параметры и назначить какие то дефолтные значения-заполнители (вот тут самая большая трабла поскольку логика ХП может быть завязана на значения и смоделировать автоматом все возможные варианты почти не возможно)
4) открыть транзакцию
5) запустить ХП на исполнение
6) получить результирующие наборы и подсчитать их кол-во
7) откатить транзакцию

8*) ну или не обязательно возиться с транзакцией можно установить set fmtonly on, но проблема с параметрами остается

и да, это капец как не правильно ибо в логике хранимок может быть что угодно
но пытаться парсить код: вы не охватываете достаточно большой объем вариантов
...
Рейтинг: 0 / 0
Как определить наличие двух SELECT в процедурах БД?
    #40011941
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Молодой
Код: sql
1.
 ,'SELECT @', '')



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
create procedure dropme_p @batch_code bigint
as
begin
    -- ошибочно посчитаем за конструкцию select @a = a 
    -- и так J раз
    select 
        @batch_code as batch_code
        , t1.field1
        ...
        , t1.filedN
    from
         t1;

    select 
        @batch_code as batch_code
        , t2.field1
        ...
        , t2.filedK
    from
         t2;
    
    ...
    
    select 
        @batch_code as batch_code
        , tJ.field1
        ...
        , tJ.filedM
    from
         tJ;


    -- посчитаем все селекты за отдельные
    with a as (
        -- описание cte1
        select
            ...
    ),
    b as (
        -- описание cte2
        select 
            ....
    ),
    .....
    z as (
        -- описание cte26
        select 
            ....
    )
    select 
        ....

    /* 
       а тут
       select 'в комментариях для примера'
       как быть с ним?
    */
end;
...
Рейтинг: 0 / 0
Как определить наличие двух SELECT в процедурах БД?
    #40011947
Молодой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env,

Я понял про неправильность использования в REPLACE

Код: sql
1.
2.
 ,'SELECT @', '')
 ,'SELECT TOP 1 @','')  




felix_ff,
Динамического SQL нет в БД
- Бог миловал.

В свете того что народ написал, вижу задачу так:

По приведенным к некому стандартному виду тексту процедур,
написать запрос максимально сокращающий их список для визуального анализа кода
...
Рейтинг: 0 / 0
Как определить наличие двух SELECT в процедурах БД?
    #40011948
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Молодой,

А какая итоговая цель? Ради чего такие сложности?
...
Рейтинг: 0 / 0
Как определить наличие двух SELECT в процедурах БД?
    #40011950
Молодой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env
Молодой,

А какая итоговая цель? Ради чего такие сложности?


Новый (древний) клиент которого хотят прикрутить к базе не понимает более одного SELECT на выходе процедур SQL сервера
...
Рейтинг: 0 / 0
Как определить наличие двух SELECT в процедурах БД?
    #40011952
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Молодой,

А не быстрее будет прогнать на тестовом контуре сценарии его использования?
...
Рейтинг: 0 / 0
Как определить наличие двух SELECT в процедурах БД?
    #40011954
Молодой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env,

Похоже быстрее.
Мало того, похоже что так оно и будет, так как по быстрому решить проблему не удается )
...
Рейтинг: 0 / 0
Как определить наличие двух SELECT в процедурах БД?
    #40011961
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как вы намерены решить проблему, даже если найдёте такие процедуры? Канонически, процедуры не должны возвращать какие-либо датасеты. Просто комментарий без намёков.
...
Рейтинг: 0 / 0
Как определить наличие двух SELECT в процедурах БД?
    #40011968
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов
Канонически, процедуры не должны возвращать какие-либо датасеты.

Хм... А почему? Павда, интересно, потому что впервые слышу об этом. Какое обоснование этому?
...
Рейтинг: 0 / 0
Как определить наличие двух SELECT в процедурах БД?
    #40011971
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat,

назначение процедуры - выполнять некоторые действия над данными, с параметрами или без. процедуры может возвращать значения в выходных параметрах. Клиентский запрос получения данных обрабатывается прямым запросом, представлением данных или функцией. Функции, будучи программным кодом, как и процедуры, не могут выполнять операций изменения данных, но могут их возвращать. Вроде бы это постулаты отцов-основателей. По крайней мере, я так запомнил.
...
Рейтинг: 0 / 0
Как определить наличие двух SELECT в процедурах БД?
    #40011972
Молодой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов
А как вы намерены решить проблему, даже если найдёте такие процедуры? Канонически, процедуры не должны возвращать какие-либо датасеты. Просто комментарий без намёков.


1) Тот небольшой список процедур (пока только одну знаем) перепишем под версией №2 с одним SELECT
2) Код старых клиентов нам доступен к исправлению - подправим их на использование Ver.2
3) Все новые клиенты пользуют Ver.2
4) Все старые оригинальную версию с двумя SELECT
...
Рейтинг: 0 / 0
Как определить наличие двух SELECT в процедурах БД?
    #40011974
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Молодой,

при этом процедура должна "понять", что ее выполняет новый или старый клиент.
...
Рейтинг: 0 / 0
Как определить наличие двух SELECT в процедурах БД?
    #40011976
Молодой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов,

Старый клиент про новую процедуру не знает - тупо, как и всегда делал, дергает старую версию.
Новые знают только про новую процедуру и дёргают только её.
...
Рейтинг: 0 / 0
Как определить наличие двух SELECT в процедурах БД?
    #40011988
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Молодой,

а как вы сейчас используете эту процедуру, возвращающую несколько датасетов?
Она вам сейчас необходима именно в таком виде?
...
Рейтинг: 0 / 0
Как определить наличие двух SELECT в процедурах БД?
    #40011993
Молодой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iap,

Процедуру писал не я.
Точно есть старые клиенты написанные тоже не мной на С++ и С# что её используют и живут
(и должны далее жить) отдельной от меня жизнью.
Трогать я эту процедуру соответственно не могу, а нового клиента прикрутить надо.
Как то так.
...
Рейтинг: 0 / 0
Как определить наличие двух SELECT в процедурах БД?
    #40011995
L_argo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов
fkthat,

назначение процедуры - выполнять некоторые действия над данными, с параметрами или без. процедуры может возвращать значения в выходных параметрах. Клиентский запрос получения данных обрабатывается прямым запросом, представлением данных или функцией. Функции, будучи программным кодом, как и процедуры, не могут выполнять операций изменения данных, но могут их возвращать. Вроде бы это постулаты отцов-основателей . По крайней мере, я так запомнил.
Эти постулаты - говно. :)

Возвращение датасета после сложнейших расчетов в ХП - чрезвычайно удобная штука. Н-р для отчетов.

Ф-ции же имеют много ограничений. Н-р невозможность работы с времянками.
...
Рейтинг: 0 / 0
Как определить наличие двух SELECT в процедурах БД?
    #40011998
Фотография SIMPLicity_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на прошлой неделе столкнулся с тем, что не могу записать в таблицу результат работы динамического запроса на линкованном сервере. В запросе в курсоре вызывается процедура, которая возвращает датасет (хотя её об этом ни кто не просит).
...
Рейтинг: 0 / 0
Как определить наличие двух SELECT в процедурах БД?
    #40012068
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
L_argo,

это лукавство чистой воды, так как отчет может выполнять запросы к витрине. MS сделали коммерческий финт с датасетами, как и во многом другом, но все равно постоянно читаешь "а вот оракле то-да сё и здесь этого нет".
...
Рейтинг: 0 / 0
Как определить наличие двух SELECT в процедурах БД?
    #40012092
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов,

Датасеты из процедуры неприятны

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

Проще говоря, датасеты из процедур вносят хаос в разработку. В рамках своего маленького мирка (например для отладки), возможно, пользоваться ими удобно, но как только процедурой начинает пользоваться кто-то ещё - начинаются проблемы.
...
Рейтинг: 0 / 0
25 сообщений из 31, страница 1 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как определить наличие двух SELECT в процедурах БД?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]