powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / alter процедур
8 сообщений из 8, страница 1 из 1
alter процедур
    #36403739
rinat.m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно ли в sql2005 сгенерировать скрипт по alter для более чем одной процедуры за 1 раз?
...
Рейтинг: 0 / 0
alter процедур
    #36404834
Фотография PokeMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут для триггеров обсуждалось. Предполагаю, что можно и для процедур.

Код: plaintext
1.
2.
3.
4.
5.
SELECT
  OBJECT_DEFINITION(o.object_id) +'
GO
  '
FROM sys.objects o
WHERE [type] = 'P'

Дальше только alter прикрутить ...
...
Рейтинг: 0 / 0
alter процедур
    #36404961
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PokeMan Тут для триггеров обсуждалось. Предполагаю, что можно и для процедур.

Код: plaintext
1.
2.
3.
4.
5.
SELECT
  OBJECT_DEFINITION(o.object_id) +'
GO
  '
FROM sys.objects o
WHERE [type] = 'P'

Дальше только alter прикрутить ... К сожалению, в общем случае задача нетривиальная.
Ведь надо заменить CREATE на ALTER, но CREATE вполне может быть, например, в комментарии
перед командой CREATE PROC. Выяснить программно, находится ли заменяемое слово CREATE в
комментарии, не так уж и просто. Пример:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
USE tempdb;
SET NOCOUNT ON;
IF OBJECT_ID(N'P','P') IS NOT NULL DROP PROC P;
GO
/*CREATE PROCEDURE P*/
CREATE PROCEDURE P AS RETURN;
GO

SELECT OBJECT_DEFINITION(OBJECT_ID(N'P','P'))
GO

/*CREATE PROCEDURE P*/
ALTER PROCEDURE P AS RETURN;
GO

SELECT OBJECT_DEFINITION(OBJECT_ID(N'P','P'))
GO
...
Рейтинг: 0 / 0
alter процедур
    #36404994
Фотография PokeMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То iap, факт.

Как вариант можно сделать DROP -> CREATE.
Или синтаксический анализ (Студия, к примеру, как раз его и производит для того чтобы сформировать ALTER).
...
Рейтинг: 0 / 0
alter процедур
    #36405307
Crimean
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PokeManТо iap, факт.

Как вариант можно сделать DROP -> CREATE.
Или синтаксический анализ (Студия, к примеру, как раз его и производит для того чтобы сформировать ALTER).

при DROP / CREATE надо запариваться с правами. а при ALTER - нет. так что смысл делать именно ALTER как раз есть
опять же, отправлю в фак, там есть подборка ссылочек на решения по данному вопросу :)
...
Рейтинг: 0 / 0
alter процедур
    #36405466
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crimeanпри DROP / CREATE надо запариваться с правами. а при ALTER - нет.Ещё нужно разбираться с WITH APPEND
...
Рейтинг: 0 / 0
alter процедур
    #36406299
Фотография DeColo®es
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgCrimeanпри DROP / CREATE надо запариваться с правами. а при ALTER - нет.Ещё нужно разбираться с WITH APPENDИ с параметрами SET ANSI_NULLS & QUOTED_IDENTIFIER

Пример, как менять CREATE на ALTER тут (см. процедуру _Context.UpdateProcedures).
Там нет "защиты" от CREATE PROCEDURE в комментариях, но это относительно несложно сделать на T-SQL.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
alter процедур
    #39781284
лолл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iap,

Была такая задача по созданию скриптера, но мешали комментарии. Можно решить на чистом T-SQL. Прототип для скалярной функции:

Код: 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.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
DECLARE
  @Text       NVarChar(MAX), -- Где ищем
  @SubString  NVarChar(4000), -- Что ищем
  @Pos        Int = 1 -- С какого символа начинаем

SET @Text = '\
/*CREATE PROCEDURE P1*/
--CREATE PROCEDURE P2
CREATE PROCEDURE P4 AS RETURN;
GO
'

SET @SubString = 'CREATE'

  DECLARE
    @TextLen      Int = LEN(@Text),
    @SubStringLen Int = LEN(@SubString),

    @C1Begin      NVarChar(2) = N'/*',
    @C1End        NVarChar(2) = N'*/',

    @C2Begin      NVarChar(2) = N'--',
    @C2End        NVarChar(2) = NChar(13),

    @C1BeginI     Int,
    @C2BeginI     Int,
    @C1EndI       Int,
    @SubStringI   Int,
    
    @C1Count      Int = 0


  WHILE @Pos > 0 AND @Pos <= @TextLen
  BEGIN

    SET @C1BeginI   = CHARINDEX(@C1Begin, @Text, @Pos)
    SET @C2BeginI   = CHARINDEX(@C2Begin, @Text, @Pos)
    SET @C1EndI     = CHARINDEX(@C1End, @Text, @Pos)
    SET @SubStringI = CHARINDEX(@SubString, @Text, @Pos) 

    PRINT 'I          =' + CAST(@Pos AS NVARCHAR)
    PRINT '@C1Count   =' + CAST(@C1Count AS NVARCHAR(60))
    PRINT 'C1BeginI   =' + CAST(CHARINDEX(@C1Begin, @Text, @Pos) AS NVARCHAR(60))
    PRINT 'C2BeginI   =' + CAST(CHARINDEX(@C2Begin, @Text, @Pos) AS NVARCHAR(60))
    PRINT 'C1EndI     =' + CAST(CHARINDEX(@C1End, @Text, @Pos) AS NVARCHAR(60))
    PRINT 'SubStringI =' + CAST(CHARINDEX(@SubString, @Text, @Pos)  AS NVARCHAR(60))

    IF @C1Count = 0
       AND
       (
        @SubStringI <= 0
        OR
        (@SubStringI < @C1BeginI OR @C1BeginI = 0)
        AND
        (@SubStringI < @C2BeginI OR @C2BeginI = 0)
        AND
        (@SubStringI < @C1EndI OR @C1EndI = 0)
       )
    BEGIN
      PRINT 'Либо строку не нашли вообще, либо нашли и она не закомментирована'
      -- Либо строку не нашли вообще, либо нашли до комментариев
      SET @Pos = @SubStringI;
      BREAK;
    END

    -- Строка есть где-то за комментариями, начинаем колдовать

    -- Начался комментарий C1
    IF @C1BeginI > 0 AND @C1BeginI < @SubStringI AND (@C1BeginI < @C2BeginI OR @C2BeginI = 0)
    BEGIN
      PRINT '/*'

      SET @C1Count += 1;

      SET @Pos = @C1BeginI + LEN(@C1Begin);
      CONTINUE;
    END

    -- Закончился комментарий C1
    IF @C1EndI > 0 AND (@C1EndI < @C2BeginI OR @C2BeginI = 0 OR @C1Count > 0)
    BEGIN
      PRINT '*/'
      IF @C1Count > 0
        SET @C1Count -= 1;

      SET @Pos = @C1EndI + LEN(@C1End);
      CONTINUE;
    END

    -- Начался комментарий C2
    IF @C2BeginI > 0 AND @C2BeginI < @SubStringI AND (@C2BeginI < @C1BeginI OR @C1BeginI = 0) AND @C1Count = 0
    BEGIN
      PRINT '--'
      SET @Pos = CHARINDEX(@C2End, @Text, @C2BeginI + LEN(@C2Begin)); -- Перейти сразу в конец!
      IF @Pos > 0
        CONTINUE;
    END    

    SET @Pos = 0;
    BREAK;
  END

  IF @TextLen = 0
    SET @Pos = 0;

  SELECT @Pos, SUBSTRING(@Text, @Pos, 19);



Останется только учесть, что между CREATE и PROCEDURE могут быть пробелы или другие комментарии, а так же сокращенный вариант CREATE PROC (ну и прочие объекты по аналогии)
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / alter процедур
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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