Create alter procedure должна быть первой инструкцией в пакетном запросе

Often I wish to do the reverse of what you are asking. For example if the user has customized a procedure, and I don’t want to lose their changes, yet I want to apply a uniform update script for all my clients, I’d like to be able to do something like the following:

if not exists ( select * from sys.objects 
            where name='myProc' and objectproperty(object_id,'IsProcedure')=1 )
create proc myProc 
as begin
  -- proc stmts here
end
go

This logic would allow me to create something only if it DOESN’T exist, but to my great frustration, SQL Server prevents this too.

I get around this problem easily enough as follows:

if not exists ( select * from sys.objects 
            where name='myProc' and objectproperty(object_id,'IsProcedure')=1 )
exec('create proc myProc 
as begin
  -- proc stmts here
  declare @object int = 0
end')
go

By passing the create proc command as a string and placing it in an exec statement we circumvent the stupid rule that prevents one from doing this in the first place.

  • Remove From My Forums
  • Question

  • Hi,
    we have below scripts for SQL server
    1) base.sql — create tables
    2) procedures.sql 
    3) triggers.sql
    4) scheduler.sql

    in upgrade flow, procedures.sql is throwing below exception even though we are executing procedures in a separate script and batches with GO

    oUpgrade Failed, due:
    org.flywaydb.core.internal.dbsupport.FlywaySqlScriptException:
    Migration V1_0_0_0_1__procedures.sql failed
    ——————————————-
    SQL State  : HY000
    Error Code : 111
    Message    : [FMWGEN][SQLServer JDBC Driver][SQLServer]’CREATE/ALTER
    PROCEDURE’ must be the first statement in a query batch.

    create or alter procedure proc-1
    AS BEGIN
    ——
    END 
    GO
    create or alter procedure proc-2
    AS BEGIN
    ——
    END 
    GO
    create or alter procedure proc-3
    AS BEGIN
    ——
    END 
    GO

    please advise if we are missing any

I am trying to execute SQL Script file in my bin folder with code from Visual Studio, before now it was working fine when I was using SQL Server 2012, I recently installed SQL server 2019 and I created the script using SQL Server 2019, when the application tries to execute the script I get the error

create/alter procedure must be the first statement in the query batch

I went to a friend who has SQL Server 2012 and created the script with his computer, it worked but when I create it with newer version I get the error, this is my code to read the script file :

public static string ReadDBFile(string path)
{
     string str;
     StreamReader reader = new StreamReader(path);
     str = reader.ReadToEnd();
     str = str.Replace("GO", "");
     reader.Close();
     return str;
}

Here is where am executing the script file :

cmd.CommandText = ReadDBFile(Application.StartupPath + "/scriptfile.sql");
cmd.ExecuteNonQuery();

I am sure this has to do with upgrade of SQL Server, any clue on how I could get this to work?

Dimmer

0 / 0 / 0

Регистрация: 24.01.2008

Сообщений: 9

1

Помогите с процедурой не пойму, что происходит

31.01.2008, 21:11. Показов 3447. Ответов 6

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Это процедура работает в SQL 6.5, а в SQL 7 и 2000 не работает
что делать
Вот процедура

T-SQL
1
2
3
4
5
6
7
8
9
10
11
if exists (select * from sysobjects where id=object_id('dbo.GetKod') and sysstat & oxf=4)
      drop procedure dbo.GetKod
go
 
  creat procedure dbo.GetKod
  @TableName char(10),
  @Kod int OUTPUT
AS
  UPDATE Kod generator
  set @kod=kod=kod+1
  where TableName=@TableName

после запуска выдает ошипку

Error 111 alter procedure must be the first statement in a query batch
must declare the variable ‘@kod’
или
Error 21037

Помогите, что делать



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

31.01.2008, 21:11

6

AiK

31.01.2008, 23:32

2

Во-первых, нужно быть уверенным, что базы case unsensetive, для того, чтобы так произвольно обращаться с регистром в переменных.
Во-вторых, не уверен, что и 6.5 будет работать конструкция
set @kod=kod=kod+1
можешь copy+paste сделать, а не писать по памяти?
Кроме того, 21037 — явно к делу не относится.

Dimmer

0 / 0 / 0

Регистрация: 24.01.2008

Сообщений: 9

01.02.2008, 00:44

 [ТС]

3

я так и сделал память дырявая
А данная конструкция работает уже пару лет в 6.5 и никаких проблем, а тут захотелось перехать на новый SQL, а он порез процедуру сделал ее такой

T-SQL
1
2
3
4
5
6
7
(creat procedure dbo.GetKod
@TableName char(10),
@Kod int OUTPUT
AS
UPDATE Kod generator
set @kod=kod=kod+1
where TableName=@TableName)

Но дельфовский клиент ругается на SQL и указывает на dbo.GetKod
я попытался вернуть исходный текст, а он выдает ошибку 111, а ошибка 21037 выскочила 1 раз не знаю почему.
теперь и незнаю ,что делать старых исходников уже и ненайти, а заново лень.



0



AiK

01.02.2008, 03:02

4

Слушай, не морочь людям голову.
Тут возможны только два варианта
1) этот код никогда не работал
2) ты криво копируешь

например в SQL нет creat, а есть create

и есть ещё минимум одна синтаксическая ошибка

Dimmer

0 / 0 / 0

Регистрация: 24.01.2008

Сообщений: 9

01.02.2008, 22:37

 [ТС]

5

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

Но вернемся к нашим баранам вот они свеже скопированные теперь вроде без ошибок и create сам на себя похож да и еще несколько ошбок исправил.
Вот код рабочий

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// код для SQL 6.5
 
IF EXISTS (SELECT * FROM sysobjects WHERE id = object_id('dbo.GetKod') AND sysstat & 0xf = 4)
    DROP PROCEDURE 'dbo'.'GetKod'
GO
 
/****** Object:  Stored Procedure dbo.GetKod    Script Date: 25.01.98 16:40:25 ******/
CREATE PROCEDURE dbo.GetKod
  @TableName CHAR(10),
  @Kod INT OUTPUT
AS
  UPDATE KodGenerator
    SET @Kod = Kod = Kod + 1
    WHERE TableName = @TableName
 
GO
//

И все работает это большой комплекс.

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//А вот код в SQL 7
 
/****** Object:  Stored Procedure dbo.GetKod    Script Date: 22.11.01 16:14:15 ******/
IF EXISTS (SELECT * FROM sysobjects WHERE id = object_id('dbo.GetKod') AND sysstat & 0xf = 4)
    DROP PROCEDURE 'dbo'.'GetKod'
 
/****** Object:  Stored Procedure dbo.GetKod    Script Date: 25.01.98 16:40:25 ******/
CREATE PROCEDURE dbo.GetKod
  @TableName CHAR(10),
  @Kod INT OUTPUT
AS
  UPDATE KodGenerator
    SET @Kod = Kod = Kod + 1
    WHERE TableName = @TableName
//

семерка говорит, что все работает но клиет ругается и нехочет с ним работать, а добавление строк вызывает 111 ошибку. что за ерунда.



0



0 / 0 / 0

Регистрация: 24.01.2008

Сообщений: 9

01.02.2008, 22:41

 [ТС]

6

Да еще строка drop procedure dbo.GetKod естественно без ковычек.



0



AiK

01.02.2008, 22:50

7

Ну так правильно, батчи кто разделять-то будет, Пушкин?
Тебе пишут английским по белому — create procedure statement
должен быть первым в батче.
В консоли есть свой разделитель go.
Что у тебя на клиенте — не знаю, возможно тот же go прокатит.

Понравилась статья? Поделить с друзьями:
  • Руководства по эксплуатации автомобилей скачать бесплатно торрент
  • Руководство для автомобили ока
  • Laurastar lift plus инструкция на русском
  • Руководство управления гибдд москвы
  • Капли в уши барс для собак инструкция по применению