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

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

Дальше только alter прикрутить ...
...
Рейтинг: 0 / 0
12.01.2010, 12:25
    #36404961
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
alter процедур
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
12.01.2010, 12:37
    #36404994
PokeMan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
alter процедур
То iap, факт.

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

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

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

Пример, как менять CREATE на ALTER тут (см. процедуру _Context.UpdateProcedures).
Там нет "защиты" от CREATE PROCEDURE в комментариях, но это относительно несложно сделать на T-SQL.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
02.03.2019, 00:41
    #39781284
лолл
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
alter процедур
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
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / alter процедур / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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