Receiving an error when attempting to use a Select statement in a function. The error states:
Msg 444, Level 16, State 2, Procedure JDE_GetWhereClause_test, Line 26
Select statements included within a function cannot return data to a client.
Any ideas?
CREATE FUNCTION [dbo].[JDE_GetWhereClause_test]
(
@tablename as varchar
)
RETURNS varchar(max)
AS
BEGIN
-- Declare the return variable here
Declare @ResultVar as varchar(max)
-- Add the T-SQL statements to compute the return value here
set @tablename = 'F0101'
Declare @Sql nvarchar(max)
Declare my_cur cursor for
SELECT fsuser FROM dbo.JDE_ExRowSecurity where fsuser = fsuser;
Declare @fsuser as nchar(15)
open my_cur;
fetch next from my_cur;
while @@fetch_status = 0
begin
fetch next from my_cur into @fsuser;
set @ResultVar += ',' + @fsuser;
end;
close my_cur;
deallocate my_cur;
-- Return the result of the function
RETURN @ResultVar
END
marc_s
730k175 gold badges1328 silver badges1457 bronze badges
asked Apr 11, 2013 at 22:38
2
Try playing with something like…
CREATE FUNCTION [dbo].[JDE_GetWhereClause_test]
(
@tablename as varchar
)
RETURNS varchar(max)
AS
BEGIN
-- Declare the return variable here
Declare @ResultVar as varchar(max)
-- Add the T-SQL statements to compute the return value here
set @ResultVar = (select STUFF((SELECT ',', fsuser as [text()]
FROM dbo.JDE_ExRowSecurity
FOR XML PATH ('')), 1, 1, '') as blah)
-- Return the result of the function
RETURN @ResultVar
END
select 'Answer is: '+[dbo].[JDE_GetWhereClause_test]('whatever')
answered Apr 12, 2013 at 11:02
AjV JsyAjV Jsy
5,7894 gold badges34 silver badges30 bronze badges
1
Found this MSDN article helpful and it resolved my issue:
RETURN (SELECT GETDATE());
Returning values directly from a select statement, avoiding variable.
answered Mar 31, 2018 at 0:11
rsrejirsreji
1701 gold badge1 silver badge17 bronze badges
1
Я пытаюсь создать функцию, которая будет запрашивать время в таблице, а затем возвращать правильное время на основе сайта.
Время в запрашиваемой таблице соответствует времени открытия и закрытия ветви. Я не уверен, следует ли мне использовать CASE или IF.
Когда я использую CASE
, я получаю такую ошибку:
Сообщение 444, уровень 16, состояние 2, рабочее время процедуры, строка 33
Операторы выбора, включенные в функцию, не могут возвращать данные клиенту.
Когда я печатаю на экране, он работает нормально.
/ добавил это для времени открытия и закрытия сайта /
DECLARE @WorkStart TIME
SET @WorkStart = '09:00'
SELECT
CASE
WHEN [Location Code] = 'OF' THEN [OpenTime]
WHEN [Location Code] = 'MP' THEN [OpenTime]
WHEN [Location Code] = 'GP' THEN [OpenTime]
WHEN [Location Code] = 'EC' THEN [OpenTime]
WHEN [Location Code] = 'WP' THEN [OpenTime]
WHEN [Location Code] = 'ZN' THEN [OpenTime]
END
FROM
[dbo].[OperationHours]
--PRINT @WorkStart
--GO
2 ответа
Лучший ответ
Во-первых, я думаю, что вы не указали все требования. Я ожидаю, что вы передадите код местоположения функции.
Ваша функция могла бы выглядеть как
CREATE FUNCTION YourFunction
(
@locationCode varchar(2)
)
RETURNS TIME
AS
BEGIN
DECLARE @OpenTime TIME
DECLARE @WorkStart TIME
SET @WorkStart = '09:00'
SELECT @OpenTime = [OpenTime]
FROM [dbo].[OperationHours]
where @locationCode = [Location Code]
RETURN ISNULL(@OpenTime, @WorkStart)
END
1
Illia
11 Ноя 2020 в 12:39
«Операторы выбора, включенные в функцию, не могут возвращать данные клиенту»
Чтобы прояснить сообщение об ошибке: вы должны присвоить свой результат переменной и вернуть переменную. SELECT, как показано в вашем вопросе, вернет набор данных клиенту. Как указано в сообщении об ошибке, это недопустимо для функции. Возврат набора данных работает для хранимой процедуры, но не для функции.
Исправление: назначьте результат вашего SELECT переменной.
Ответ @Illia выше должен работать.
0
jim
11 Ноя 2020 в 15:58
Обновлено 07.12.2019
Вопрос:
У меня есть таблица Дисциплины
DisciplineID |Discipline_Name
1 | Aquatics
2 | Archery
3 | Athletics
Я представляю функцию, которая принимает строку типа (“Aquatics, Archery”) и возвращает таблицу с записями Aquatics Archery (в основном разделяет строку), функция для нее следующая:
CREATE FUNCTION SplitString
(
@Input NVARCHAR(MAX)
)
RETURNS @Output TABLE (
Item NVARCHAR(1000)
)
AS
BEGIN
DECLARE @StartIndex INT, @EndIndex INT, @Character CHAR(1)
SET @StartIndex = 1
SET @Character =','
IF SUBSTRING(@Input, LEN(@Input) - 1, LEN(@Input)) <> @Character
BEGIN
SET @Input = @Input + @Character
END
WHILE CHARINDEX(@Character, @Input) > 0
BEGIN
SET @EndIndex = CHARINDEX(@Character, @Input)
INSERT INTO @Output(Item)
SELECT SUBSTRING(@Input, @StartIndex, @EndIndex - 1)
SET @Input = SUBSTRING(@Input, @EndIndex + 1, LEN(@Input))
END
RETURN
END
GO
Также другая функция:
create function getdisID
(
@Inp varchar(1000)
)
RETURNS @Output TABLE (
Itemid int
)
as
begin
SELECT DisciplineID
FROM Disciplines
inner JOIN
dbo.SplitString(@Inp) as temp
ON Disciplines.Discipline_Name=temp.Item;
end
Вторая функция после выполнения вызывает ошибку: ” Операции Select, входящие в функцию, не могут возвращать данные клиенту “.
Лучший ответ:
Скрипт для второй функции должен выглядеть следующим образом:
create function getdisID
(
@Inp varchar(1000)
)
RETURNS @Output TABLE (
Itemid int
)
as
begin
insert into @Output
select DisciplineID
FROM Disciplines
inner JOIN
dbo.SplitString(@Inp) as temp
ON Disciplines.Discipline_Name=temp.Item;
return
end
Ответ №1
Помогает ли это
create function getdisID (@Inp varchar(1000))
Returns Table
As
Return (
SELECT DisciplineID
FROM Disciplines
inner JOIN dbo.SplitString(@Inp) as temp
ON Disciplines.Discipline_Name=temp.Item;
)
Ответ №2
create function getdisID
(
@Inp varchar(1000)
)
RETURNS @Output TABLE (
Itemid int
)
as
begin
INSERT INTO @Output(Itemid)
SELECT DisciplineID
FROM Disciplines
inner JOIN
dbo.SplitString(@Inp) as temp
ON Disciplines.Discipline_Name=temp.Item;
end
Вам нужно либо использовать хранимую процедуру для возврата результата, либо вам нужно вставить данные в параметр выходной таблицы
Я пытаюсь создать функцию, которая будет запрашивать время в таблице, а затем возвращать правильное время на основе сайта.
Время в запрашиваемой таблице соответствует времени открытия и закрытия ветви. Я не уверен, следует ли мне использовать CASE или IF.
Когда я использую
CASE
, Я получаю эту ошибку:
Msg 444, уровень 16, состояние 2, рабочее время процедуры, строка 33
Операторы Select, включенные в функцию, не могут возвращать данные клиенту.
Когда я печатаю на экране, он работает нормально.
/добавил это для времени открытия и закрытия сайта/
DECLARE @WorkStart TIME
SET @WorkStart = '09:00'
SELECT
CASE
WHEN [Location Code] = 'OF' THEN [OpenTime]
WHEN [Location Code] = 'MP' THEN [OpenTime]
WHEN [Location Code] = 'GP' THEN [OpenTime]
WHEN [Location Code] = 'EC' THEN [OpenTime]
WHEN [Location Code] = 'WP' THEN [OpenTime]
WHEN [Location Code] = 'ZN' THEN [OpenTime]
END
FROM
[dbo].[OperationHours]
--PRINT @WorkStart
--GO
#sql #sql-server #function
#sql #sql-сервер #функция
Вопрос:
Я пытаюсь создать следующую функцию:
Create function mastercount
(
@table nvarchar(50)
, @policy nvarchar(20)
, @firstname nvarchar(20)
, @lastname nvarchar (20)
)
Returns nvarchar (50)
As
Begin
Declare @count int =''
If @table ='A'
Select count (*)
from A
where policy = @policy and firstname = @firstname and lastname = @lastname
Else If @table ='B'
Select count (*)
from A
where policy = @policy and firstname = @firstname and lastname = @lastname
Else If @table ='A'
Select count (*)
from A
where policy = @policy and firstname = @firstname and lastname = @lastname
Return @count;
End
Но я получаю ошибку:
ОПЕРАТОРЫ ВЫБОРА, ВКЛЮЧЕННЫЕ В ФУНКЦИЮ, НЕ МОГУТ ВЕРНУТЬ ДАННЫЕ КЛИЕНТУ
Комментарии:
1. Да, вы не можете сделать это в функции. Как четко указано в сообщении об ошибке. В чем ваш вопрос? Вероятно, вы хотите назначить на
@count
вместо прямогоselect
2. Ваш путь, вероятно, связан с проблемами схемы и, скорее всего, приведет вас в тупик. Поскольку ваша функция, похоже, генерирует количество строк, тип возвращаемого значения должен быть int или bigint, а не nvarchar.
3. Мой вопрос в том, как я могу вернуть счетчик без получения этой ошибки, может кто-нибудь, пожалуйста, уточнить это?
4. Мартин уже сказал вам, например, выбрать в переменную
5. Еще лучше, не используйте SELECT для присвоения скалярного значения. Используйте SET. Пример:
set @count = (select count(*) from ....);
Обратите внимание на завершение инструкции — начните развивать хорошие привычки.
Ответ №1:
Вы могли бы попробовать это таким образом. Переменной @count присваивалась пустая строка. Я изменил это, чтобы значение по умолчанию было равно 0. Кроме того, операторы выбора пытались вернуть записи клиенту. Теперь каждый из них вместо этого присваивается переменной @count.
Create function mastercount
(
@table nvarchar(50)
, @policy nvarchar(20)
, @firstname nvarchar(20)
, @lastname nvarchar (20)
)
Returns int
As
Begin
Declare @count int=0;
If @table ='A'
Select @count=count(*)
from A
where policy = @policy and firstname = @firstname and lastname = @lastname
Else If @table ='B'
Select @count=count(*)
from A
where policy = @policy and firstname = @firstname and lastname = @lastname
Else If @table ='A'
Select @count=count(*)
from A
where policy = @policy and firstname = @firstname and lastname = @lastname
Return @count;
End