Инструкции select входящие в функцию не могут возвратить данные клиенту

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's user avatar

marc_s

727k174 gold badges1325 silver badges1454 bronze badges

asked Apr 11, 2013 at 22:38

Ankur's user avatar

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 Jsy's user avatar

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

rsreji's user avatar

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
GO

CREATE 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

Понравилась статья? Поделить с друзьями:
  • Гармин альфа 100 инструкция на русском языке
  • Осциллограф fnirsi 1c15 инструкция на русском языке скачать
  • Крем краска для бровей studio professional татуаж инструкция по применению
  • Сушка для фруктов rommelsbacher da 750 инструкция
  • Чистящее средство для посудомоечных машин сомат инструкция по применению