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
727k174 gold badges1325 silver badges1454 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,7194 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
Вопрос:
У меня есть таблица Дисциплины
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
Я строю свою первую скалярную функцию (MS SQL Server), и я получаю эту ошибку:
«Операторы выбора, включенные в функцию, не могут возвращать данные клиенту».
Я понимаю, что я не могу использовать select statement, но как мне получить информацию?
Функция показывает, изучал ли ученик и передал элементарные предметы, и работает таким образом:
идентификатор параметра — это общий идентификатор, который дает мне студента из таблицы Students.
Затем из таблицы Темы я получаю тему. Функция getKindOfSubjectStudied, заданная параметром kindOfSubject, покажет, является ли предмет, пройденный учеником элементарным. Если это так, результат будет равен 1, иначе будет 0.
Все запросы, протестированные отдельно, работают без ошибок.
Ниже приведен код функции.
Спасибо большое
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
USE MYDBASE
GOCREATE FUNCTION [dbo].[getStudentHasElementary]
(
-- paramenter
@id int
)
RETURNS INTEGER
AS
BEGIN
DECLARE @Result AS INTEGER
DECLARE @return_value varchar (50)SELECT studentsid
FROM dbo.Students
WHERE (id = id)SELECT kindOfSubject
FROM dbo.Subjects
WHERE (studentsid = studentsid)--- I use this function to know if the subject is elementary
EXEC @return_value = [dbo].[getKindOfSubjectStudied]
@id = id,
@kindOfSubject = kindOfSubject;SELECT 'Return Value' = @return_value
IF (@return_value = 'elementary')
BEGIN
SET @Result = 1
END
ELSE
BEGIN
SET @Result = 0
END
RETURN @Result
END