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
201k36 gold badges290 silver badges355 bronze badges
asked Jul 28, 2014 at 19:31
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
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 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.
answered Sep 22, 2015 at 17:58
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
30.7k4 gold badges46 silver badges68 bronze badges
answered Jul 28, 2014 at 19:35
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
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
131k46 gold badges330 silver badges415 bronze badges
answered Jun 14, 2016 at 10:38
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
Всякий раз, когда я запускаю это вместе с другими инструкциями 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 даст такую же ошибку.
Ответ №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% На вход поступает 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!
Я пытался
0 |
cygapb-007 1312 / 944 / 144 Регистрация: 17.01.2013 Сообщений: 2,348 |
||||
13.01.2015, 23:07 |
4 |
|||
РешениеЕсли уж обязательно функцию (хотя не понимаю, зачем), то примерно так:
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 |