Инструкция create function должна быть единственной в пакете

I’m getting this error from the function:

CREATE FUNCTION getLavel(@id int ,@lavel char)
RETURNS date
BEGIN
 DECLARE @date date
    select @date = (select authorization_date from Authorized WHERE diver_number = @id and @lavel =level_name)
    return @date
END
GO

What can be the reason?

Ty very much.

juergen d's user avatar

juergen d

201k36 gold badges290 silver badges355 bronze badges

asked Jul 28, 2014 at 19:31

user3885474's user avatar

3

The function needs to be either the only function in the query window OR the only statement in the batch. If there are more statements in the query window, you can make it the only one «in the batch» by surrounding it with GO’s.

e.g.

GO
CREATE FUNCTION getLavel(@id int ,@lavel char)
RETURNS date
BEGIN
 DECLARE @date date
    select @date = (select authorization_date from Authorized WHERE     diver_number = @id and @lavel =level_name)
    return @date
END
GO

answered May 28, 2015 at 8:54

nicV's user avatar

nicVnicV

6307 silver badges16 bronze badges

1

Turn this into an inline table valued function. This will perform better than the scalar function. Also, you should NOT use the default sizes for character datatypes. Do you know what the default length for a char is? Did you know that it can vary based on usage?

CREATE FUNCTION getLavel
(
    @id int
    , @lavel char --You need to define the length instead of the default length
) 
RETURNS table
return 
    select authorization_date 
    from Authorized 
    WHERE diver_number = @id 
        and @lavel = level_name

GO

answered Jul 28, 2014 at 19:38

Sean Lange's user avatar

Sean LangeSean Lange

32.8k3 gold badges26 silver badges39 bronze badges

5

You need to add RETURN before the END statement

That should fix your issue, that’s what fixed mine. :D

answered Sep 22, 2015 at 17:58

FoxArc's user avatar

FoxArcFoxArc

1149 bronze badges

Make sure that this statement is the only the only sql in your query window before you execute it.

Or you can highlight the function declaration and execute

Ben Thul's user avatar

Ben Thul

30.7k4 gold badges46 silver badges68 bronze badges

answered Jul 28, 2014 at 19:35

WantToBeAnonomous's user avatar

What solved it for me, was that I was trying to create the function inside of a transaction context — that doesn’t make sense from a SQL Server point of view. Transactions are for data, not functions.

Take the CREATE FUNCTION statement out of the transaction, then wrap it in GO’s

answered Dec 10, 2017 at 20:05

Michael Malone's user avatar

CREATE FUNCTION CalculateAge(@DOB  DATE) 
RETURNS INT 
AS
BEGIN
DECLARE @Age INT
SET @DOB='08/12/1990'
SET @Age =DATEDIFF(YEAR,@DOB,GETDATE()) -
   CASE
        WHEN (MONTH (@DOB)>  MONTH (GETDATE ())) OR
             (MONTH (@DOB)= MONTH (GETDATE ())  AND DAY (@DOB) >DAY (GETDATE ()))

    THEN 1 
    ELSE 0
    END 
SELECT @Age
END

Tunaki's user avatar

Tunaki

131k46 gold badges330 silver badges415 bronze badges

answered Jun 14, 2016 at 10:38

MR.Rabin Shrestha's user avatar

1

The Error is given to you in only query Page But if you execute the query then it will successfully execute.

CREATE FUNCTION getLavel(@id int ,@lavel char)
RETURNS date
BEGIN
 DECLARE @date date
    select @date = (select authorization_date from Authorized WHERE diver_number = @id and @lavel = level_name)
    return @date
END
GO

answered Oct 25, 2020 at 12:29

Adarsh Bhalani's user avatar

Всякий раз, когда я запускаю это вместе с другими инструкциями SQL, он выдает ошибку:

CREATE FUNCTION ‘должен быть первым оператором в пакете запроса

Однако всякий раз, когда я выполняю его один (без SELECT * FROM CUSTOMER в моем случае это работает)

   SELECT * FROM CUSTOMER;

   create function udfLogin
    (@username nvarchar(100), @password nvarchar(100)) 
    returns int as
    begin
      if exists(select 1 from CUSTOMER where Username = @username and [Password] = @password)
        return 1
      return 0;
    end

3 ответа

Лучший ответ

Вы должны отделить каждую партию кода с помощью ключевого слова GO.

SELECT * FROM CUSTOMER
 GO
   create function udfLogin
    (@username nvarchar(100), @password nvarchar(100)) 
     returns int as
     begin
      if exists(select 1 from CUSTOMER where Username = @username and 
      [Password] = @password)
       return 1
     return 0;
   end
Go


1

Mehrnoosh
27 Мар 2018 в 11:27

Как следует из сообщения об ошибке, оператор CREATE FUNCTION должен быть первым оператором в пакете запроса. Перед оператором CREATION FUNCTION не должно быть других операторов, которые сделали бы его не первым оператором в пакете запроса. Как следует из сообщения, чтобы избежать этой ошибки, оператор CREATE FUNCTION должен быть первым оператором в пакете запроса.

SQL выполняет инструкцию как пакет запроса.

Правила использования пакетов

Следующие правила применяются к использованию пакетов:

Операторы CREATE DEFAULT, CREATE FUNCTION, CREATE PROCEDURE, CREATE RULE, CREATE SCHEMA, CREATE TRIGGER и CREATE VIEW нельзя объединять с другими операторами в пакете. Оператор CREATE должен запустить пакет. Все остальные операторы, которые следуют в этом пакете, будут интерпретированы как часть определения первого оператора CREATE.


0

Karthik Venkatraman
27 Мар 2018 в 11:37

Вы должны включить разделитель партии, например, Go

SELECT * FROM CUSTOMER
GO
   create function udfLogin
    (@username nvarchar(100), @password nvarchar(100)) 
    returns int as
    begin
      if exists(select 1 from CUSTOMER where Username = @username and [Password] = @password)
        return 1
      return 0;
    end
Go


2

Mazhar
27 Мар 2018 в 11:26

Вопрос:

Я пытаюсь сначала проверить, существует ли функция, и создать ее, если она не существует.

Я получаю эту ошибку от функции:

IF NOT EXISTS (SELECT * FROM sys.objects
WHERE object_id = OBJECT_ID(N'[dbo].[GetRelativeExpiry]') AND type in (N'U'))
BEGIN

SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON

CREATE FUNCTION [dbo].[GetRelativeExpiry]
(
@Date DATE,
@N INT
)
RETURNS DATE
AS
BEGIN
-- Declare the return variable here
DECLARE @Expiry as DATE;

IF @N > 0
BEGIN
SELECT @Expiry = MAX(E2.Expiry)
FROM (SELECT TOP(@N) Expiry
FROM ExpiryDates E1
WHERE E1.Expiry >= @date
ORDER BY E1.Expiry) AS E2
END
ELSE
BEGIN
SELECT @Expiry = MIN(E2.Expiry)
FROM (SELECT TOP(-@N) Expiry
FROM ExpiryDates E1
WHERE E1.Expiry <= @date
ORDER BY E1.Expiry DESC) AS E2
END
RETURN @Expiry

END

END

Я не уверен, почему я получаю эту ошибку, может кто-то может помочь? Я использую Microsoft SQL Server Management Studio 2014

Лучший ответ:

Если вы пытаетесь сделать это в обычном окне в MS SQL Server Management Studio 2014 (или любой предыдущей версии), где вы обычно записываете все другие запросы, то ваше определение функции должно быть очень первым утверждением, которое не комментируется.

См. Изображение ниже. Если инструкция USE PTCRMstaging_test; не был прокомментирован, SQL Server Management Studio даст такую же ошибку.

enter image description here

Ответ №1

Операторы CREATE, будь то для TYPE, PROCEDURE, FUNCTION,... всегда должны быть первым оператором в пакете.

Чтобы обойти это в таких партиях, как ваш, выполните инструкцию CREATE с помощью sp_executesql следующим образом:

EXEC sp_executesql N'
-- your CREATE statement here
';

#sql #sql-server #view #ssms

#sql #sql-сервер #Вид #ssms

Вопрос:

Microsoft SQL Server Management Studio 18 показывает ошибку:

CREATE VIEW должна быть единственной инструкцией в пакете

После выполнения запроса появляется следующая ошибка:

Неправильный синтаксис вокруг ключевого слова «select»

 create view revenue0 (supplier_no, total_revenue) as
    select
        l_suppkey,
        sum(l_extendedprice * (1 - l_discount))
    from
        lineitem
    where
        l_shipdate >= '1996-05-01'
        and l_shipdate < dateadd(mm,3,cast('1996-05-01' as datetime))
    group by
        l_suppkey;


select
s_suppkey,
s_name,
s_address,
s_phone,
total_revenue
from
supplier,
revenue0
where
    s_suppkey = supplier_no
    and total_revenue = (
        select
            max(total_revenue)
        from
            revenue0
    )
order by
s_suppkey
option (maxdop 2)
drop view revenue0
 

UPD. Я попытался запустить этот метод:

 create view revenue0 (supplier_no, total_revenue) as
    select
        l_suppkey,
        sum(l_extendedprice * (1 - l_discount))
    from
        lineitem
    where
        l_shipdate >= cast('1996-05-01' as datetime)
        and l_shipdate < dateadd(mm, 3, cast('1996-05-01' as datetime))
    group by
        l_suppkey;

go
select
    s_suppkey,
    s_name,
    s_address,
    s_phone,
    total_revenue
from
    supplier,
    revenue0
where
    s_suppkey = supplier_no
    and total_revenue = (
        select
            max(total_revenue)
        from
            revenue0
    )
order by
    s_suppkey;

drop view revenue0;
 

Но в результате выполнения запроса отображается ошибка:
Недопустимое имя объекта «revenue0».
Как только я не изменил свое имя. SQL все равно ругается на это имя.

UPD2. Вопрос был решен самостоятельно. Тема закрыта! Спасибо всем за ваши усилия!

Комментарии:

1. Поместите слово GO после определения представления.

2. Можете ли вы сказать мне, где именно? Я не очень хорошо разбираюсь в SQL. Я буду очень благодарен!

3. group by l_suppkey; GO

4. Неправильный синтаксис вокруг конструкции «go».

5. вы не можете использовать «order by» в представлении, измените свой вид, чтобы не использовать его.

Ответ №1:

Ошибка сообщает, что CREATE VIEW должен быть единственным оператором в пакете. Пакет завершается в SQL Server ключевым словом «GO», как заявил Гордон, поэтому ваш код должен выглядеть следующим образом:

 create view revenue0 (supplier_no, total_revenue) as
    select
        l_suppkey,
        sum(l_extendedprice * (1 - l_discount))
    from
        lineitem
    where
        l_shipdate >= '1996-05-01'
        and l_shipdate < dateadd(mm,3,cast('1996-05-01' as datetime))
    group by
        l_suppkey;

GO -- right here. This ends a batch. Must be on a new line, with no semi-color, or SQL gets pissy. 

select
    s_suppkey,
    s_name,
    s_address,
    s_phone,
    total_revenue
from
    supplier,
    revenue0
where
    s_suppkey = supplier_no
    and total_revenue = (
        select
            max(total_revenue)
        from
            revenue0
    )
order by
    s_suppkey
option (maxdop 2); 

drop view revenue0;
 

Комментарии:

1. Я тестирую «Тесты TPC-H на MS-SQL-Server» этот материал: ссылка . При выполнении этого запроса это должно быть: link .

2. Но у меня, с вашей поправкой, после выполнения SQL-запроса выводится пустая таблица. Время выполнения запроса составляет 0 секунд. Это ненормально.

3. Вы можете помочь переделать этот запрос, чтобы он работал: ссылка .

4. Я уже всю голову сломал с ним. Но этот конкретный запрос не хочет работать. Все остальные работают.

50 / 50 / 6

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

Сообщений: 232

1

Создание функции для определения скидки

12.01.2015, 21:38. Показов 7510. Ответов 5


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

Необходимо написать функцию, которая в зависимости от стоимости покупки определяет скидку. Не представляю, как это можно сделать на T-SQL.

10000> 2%
40000> 3%
100000> 5%

На вход поступает FLOAT — стоимость покупки, на выходе FLOAT — скидка поделенная на 100.



0



1312 / 944 / 144

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

Сообщений: 2,348

12.01.2015, 21:59

2

Функция называется CASE



0



T2skler

50 / 50 / 6

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

Сообщений: 232

13.01.2015, 22:50

 [ТС]

3

UP!

T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
CREATE FUNCTION dbo.testF(@n1 int)
RETURNS INT
BEGIN
    DECLARE @n2 INT
      CASE 
         WHEN n1 >= 10000 AND n1 < 40000  THEN @n2=2
         WHEN n1 >= 40000 AND n1 < 100000 THEN @n2=3
         WHEN n1 >= 100000 THEN @n2=5
         ELSE @n2=0
      END
    return (@n2)
END

Я пытался Помогите функцию дописать, курсач из-за этого висит мёртвым грузом(



0



cygapb-007

1312 / 944 / 144

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

Сообщений: 2,348

13.01.2015, 23:07

4

Лучший ответ Сообщение было отмечено T2skler как решение

Решение

Если уж обязательно функцию (хотя не понимаю, зачем), то примерно так:

T-SQL
1
2
3
4
5
6
7
8
9
10
11
CREATE FUNCTION dbo.testF(@n1 int)
RETURNS INT
BEGIN
   RETURN 
      CASE 
         WHEN @n1 <  10000 THEN 0
         WHEN @n1 <  40000 THEN 2
         WHEN @n1 < 100000 THEN 3
         ELSE 5
      END
END



1



50 / 50 / 6

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

Сообщений: 232

14.01.2015, 15:33

 [ТС]

5

А кто подскажет, что за сообщение об ошибке: инструкция create function должна быть единственной в пакете?



0



4 / 4 / 1

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

Сообщений: 18

14.01.2015, 16:15

6

Это значит — кроме функции никаких других строк в запросе быть не должно.



0



Понравилась статья? Поделить с друзьями:

А вот и еще наши интересные статьи:

  • Руководство по тиктоку
  • Мексидол нейрокс инструкция по применению цена
  • Должностная инструкция электромонтера контактной сети 5 разряда должностная
  • Condor mdr 3 инструкция по эксплуатации
  • Веко духовой шкаф электрический встраиваемый инструкция по применению

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии