Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как определить наличие двух SELECT в процедурах БД? / 25 сообщений из 31, страница 1 из 2
26.10.2020, 15:21
    #40011911
Молодой
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить наличие двух SELECT в процедурах БД?
Требуется найти в БД все процедуры, в которых есть два и более выходных дата сета.
То есть, в теле процедуры есть более одной конструкции вида
Код: 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
26.10.2020, 15:29
    #40011920
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить наличие двух SELECT в процедурах БД?
Никак, ибо количество резалтсетов может зависит о входных параметров.
Сколько резалтсетов в процедуре вида?


Код: 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
26.10.2020, 15:35
    #40011922
Молодой
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить наличие двух SELECT в процедурах БД?
Точно, точно!

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

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



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

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

И чтобы совсем жизнь малиной не казалась
Код: 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
26.10.2020, 16:13
    #40011935
Молодой
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить наличие двух SELECT в процедурах БД?
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
26.10.2020, 16:32
    #40011938
felix_ff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить наличие двух SELECT в процедурах БД?
Молодой,

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

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

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

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

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

и да, это капец как не правильно ибо в логике хранимок может быть что угодно
но пытаться парсить код: вы не охватываете достаточно большой объем вариантов
...
Рейтинг: 0 / 0
26.10.2020, 16:42
    #40011941
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить наличие двух SELECT в процедурах БД?
Молодой
Код: 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
26.10.2020, 16:57
    #40011947
Молодой
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить наличие двух SELECT в процедурах БД?
env,

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

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




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

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

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

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

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


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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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


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