Инструкции 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

733k175 gold badges1330 silver badges1460 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,7994 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

Обновлено 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, я получаю такую ошибку:

Сообщение 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

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

Время в запрашиваемой таблице соответствует времени открытия и закрытия филиала. Я не уверен, следует ли мне использовать CASE или IF.

Когда я использую CASE, я получаю эту ошибку:

Сообщение 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

Logo
MurCode

  • Форумы
  • Поиск
  • О проекте

Помогите засунуть в функцию или процедуру запрос.

Nikita Gavrilov

Дата: 12.09.2016 18:45:10

Здравствуйте.

USE [шшшш]
GO
/****** Object:  UserDefinedFunction [dbo].[Rootdepart]    Script Date: 12.09.2016 10:43:17 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- Возвращает дерево департамент.
create function [dbo].[Rootdepart](@o_id int =0 ) RETURNs @rett table (kid int primary key, pid int , br varchar(500))  as

begin

with tree (kid, pid, br)
as (Select EOT_1.DepartmentID kid, IsNull(EOT_2.DepartmentID, null) pid, (
    Select
      DepartBrief DepartBrief
    From
      DepartmentMove EOT_5
    Where
      (EOT_5.DepartmentID = EOT_1.DepartmentID) and (EOT_5.MoveDate = (
        Select
          Max(EOT_6.MoveDate)
          Column1
        From
          DepartmentMove EOT_6
        Where
          (EOT_6.DepartmentID = EOT_1.DepartmentID) and (EOT_6.MoveDate <= Convert(DateTime, '20160912 00:00:00', 112)) and (EOT_6.isProject = 0)
      )) and (EOT_5.isProject = 0)
  ) br
From
  Department EOT_1
  Left Outer Join Department EOT_2
    On (EOT_2.DepartmentID = (
      Select
        EOT_3.ParentID ПодразделениеРодитель
      From
        DepartmentMove EOT_3
      Where
        (EOT_3.DepartmentID = EOT_1.DepartmentID) and (EOT_3.MoveDate = (
          Select
            Max(EOT_4.MoveDate)
            Column1
          From
            DepartmentMove EOT_4
          Where
            (EOT_4.DepartmentID = EOT_1.DepartmentID) and (EOT_4.MoveDate <= Convert(DateTime, '20160912 00:00:00', 112))
        )) and (EOT_3.isProject = 0)
    ))
 where eot_2.DepartmentID is null and eot_1.DepartmentID=@o_id
union all
   Select EOT_1.DepartmentID kid, IsNull(EOT_2.DepartmentID, null) pid, (
    Select
      DepartBrief DepartBrief
    From
      DepartmentMove EOT_5
    Where
      (EOT_5.DepartmentID = EOT_1.DepartmentID) and (EOT_5.MoveDate = (
        Select
          Max(EOT_6.MoveDate)
          Column1
        From
          DepartmentMove EOT_6
        Where
          (EOT_6.DepartmentID = EOT_1.DepartmentID) and (EOT_6.MoveDate <= Convert(DateTime, '20160912 00:00:00', 112)) and (EOT_6.isProject = 0)
      )) and (EOT_5.isProject = 0)
  ) br
From
  Department EOT_1
  Left Outer Join Department EOT_2
    On (EOT_2.DepartmentID = (
      Select
        EOT_3.ParentID ПодразделениеРодитель
      From
        DepartmentMove EOT_3
      Where
        (EOT_3.DepartmentID = EOT_1.DepartmentID) and (EOT_3.MoveDate = (
          Select
            Max(EOT_4.MoveDate)
            Column1
          From
            DepartmentMove EOT_4
          Where
            (EOT_4.DepartmentID = EOT_1.DepartmentID) and (EOT_4.MoveDate <= Convert(DateTime, '20160912 00:00:00', 112))
        )) and (EOT_3.isProject = 0)
    )) inner join tree on tree.kid = EOT_1.departmentid) 
insert @rett 
select kid,pid,br 
from tree
--option (maxrecursion 10)
--delete from @t

return  

end
go

ошибка
Msg 467, Level 16, State 1, Procedure Rootdepart, Line 14
Функции GROUP BY, HAVING и агрегатные функции не разрешены в рекурсивной части рекурсивного обобщенного табличного выражения «tree».
Msg 462, Level 16, State 1, Procedure Rootdepart, Line 14
Внешнее соединение не разрешено в рекурсивной части рекурсивного обобщенного табличного выражения «tree».
Msg 208, Level 16, State 1, Line 98
Подскажите пожалуйста, что не так?

a_voronin

Дата: 12.09.2016 19:30:29

Nikita Gavrilov,

Max(EOT_4.MoveDate) — недопустим в рекурсивном запросе.

Nikita Gavrilov

Дата: 13.09.2016 11:57:37

create function [dbo].[Rootdepart](@o_id int =0 ) RETURNs @rett table (kid int primary key, pid int , br varchar(500))  as

begin

declare @t table (kid int primary key, pid int , br varchar(500)) 
insert into @t 
Select EOT_1.DepartmentID kid, IsNull(EOT_2.DepartmentID, null) pid, (
    Select
      DepartBrief DepartBrief
    From
      DepartmentMove EOT_5
    Where
      (EOT_5.DepartmentID = EOT_1.DepartmentID) and (EOT_5.MoveDate = (
        Select
          Max(EOT_6.MoveDate)
          Column1
        From
          DepartmentMove EOT_6
        Where
          (EOT_6.DepartmentID = EOT_1.DepartmentID) and (EOT_6.MoveDate <= Convert(DateTime, '20160912 00:00:00', 112)) and (EOT_6.isProject = 0)
      )) and (EOT_5.isProject = 0)
  ) br
From
  Department EOT_1
  Left Outer Join Department EOT_2
    On (EOT_2.DepartmentID = (
      Select
        EOT_3.ParentID ПодразделениеРодитель
      From
        DepartmentMove EOT_3
      Where
        (EOT_3.DepartmentID = EOT_1.DepartmentID) and (EOT_3.MoveDate = (
          Select
            Max(EOT_4.MoveDate)
            Column1
          From
            DepartmentMove EOT_4
          Where
            (EOT_4.DepartmentID = EOT_1.DepartmentID) and (EOT_4.MoveDate <= Convert(DateTime, '20160912 00:00:00', 112))
        )) and (EOT_3.isProject = 0)
    ))
; with tree (kid, pid, br, br1)
as (select kid, pid, br, cast(kid as varchar(500)) br1
   from @t
 where pid is null and kid=@o_id
union all
   select t.kid, t.pid, t.br, cast(cast(tree.br1  as varchar(500)) +','+cast(t.kid as varchar(500)) as varchar(500))
   from @t t inner join tree on tree.kid = t.pid) 
select * 
from tree
option (maxrecursion 10)
delete from @t

return  

end

дает ошибку
Msg 444, Level 16, State 2, Procedure Rootdepart, Line 51
Инструкции SELECT, входящие в функцию, не могут возвратить данные клиенту.
Подскажите пожалуйста, что не так?

Maxx

Дата: 13.09.2016 12:04:57

Nikita Gavrilov
delete from @t

а це за для нафига то ?

Nikita Gavrilov

Дата: 13.09.2016 12:35:06

Maxx,
Чтоб удалить временную таблицу (убрал ошибка все равно осталась)

Ken@t

Дата: 13.09.2016 12:50:19

Nikita Gavrilov,

select * 
from tree
option (maxrecursion 10)

Это выкиньте

TaPaK

Дата: 13.09.2016 13:05:07

return  

чего возвращать??
если не ошибаюсь, должно быть типа

RETURN (;WITH cc .... SELECT * FROM ccc)
Ken@t
Nikita Gavrilov,

select * 
from tree
option (maxrecursion 10)

Это выкиньте

:)

Nikita Gavrilov

Дата: 13.09.2016 13:57:33

TaPaK,
Что то куда бы не вставил этот return везде дает ошибку

;with tree (kid, pid, br, br1)
as (select kid, pid, br, cast(kid as varchar(500)) br1
   from @t
 where pid is null and kid=@o_id
union all
   select t.kid, t.pid, t.br, cast(cast(tree.br1  as varchar(500)) +','+cast(t.kid as varchar(500)) as varchar(500))
   from @t t inner join tree on tree.kid = t.pid)
--   select kid from tree
--return kid--(select kid from tree);
--option (maxrecursion 10)
 return;
--delete @t
end

ошибка
Msg 156, Level 15, State 1, Procedure Rootdepart, Line 62
Неправильный синтаксис около ключевого слова «return».
Msg 1075, Level 15, State 1, Procedure Rootdepart, Line 62
Инструкции RETURN в скалярных функциях должны содержать аргумент.

return;with tree (kid, pid, br, br1) as select....

ошибка
Msg 1075, Level 15, State 1, Procedure Rootdepart, Line 51
Инструкции RETURN в скалярных функциях должны содержать аргумент.
Msg 156, Level 15, State 1, Procedure Rootdepart, Line 67
Неправильный синтаксис около ключевого слова «end».

;with tree (kid, pid, br, br1)
as (select kid, pid, br, cast(kid as varchar(500)) br1
   from @t
 where pid is null and kid=@o_id
union all
   select t.kid, t.pid, t.br, cast(cast(tree.br1  as varchar(500)) +','+cast(t.kid as varchar(500)) as varchar(500))
   from @t t inner join tree on tree.kid = t.pid)
  select kid from tree
--return kid--(select kid from tree);
--option (maxrecursion 10)
return(kid);
--delete @t
end

ошибка
Msg 444, Level 16, State 2, Procedure Rootdepart, Line 51
Инструкции SELECT, входящие в функцию, не могут возвратить данные клиенту.
Msg 207, Level 16, State 1, Procedure Rootdepart, Line 61
Недопустимое имя столбца «kid».

TaPaK

Дата: 13.09.2016 14:00:55

Nikita Gavrilov,

жесть… либо крестик либо трусы

если пишете
RETURNs @rett table (kid int primary key, pid int , br varchar(500)
то и вставляйте в эту таблицу и тогда просто RETURN

если
RETUTN TABLE
то
RETURN (;WITH … SELECT … )

Nikita Gavrilov

Дата: 13.09.2016 14:08:02

TaPaK,

;with @tree (kid, pid, br, br1)
as (select kid, pid, br, cast(kid as varchar(500)) br1
   from @t
 where pid is null and kid=@o_id
union all
   select t.kid, t.pid, t.br, cast(cast(tree.br1  as varchar(500)) +','+cast(t.kid as varchar(500)) as varchar(500))
   from @t t inner join @tree on @tree.kid = t.pid)
   --select kid from @tree
--return kid--(select kid from tree);
--option (maxrecursion 10)
 return;
--delete @t
end

Msg 102, Level 15, State 1, Procedure Rootdepart, Line 51
Неправильный синтаксис около конструкции «@tree».

Понравилась статья? Поделить с друзьями:
  • Инструкции avx age of empires 4
  • Инструкции для лего самоделок танков
  • Инструкции для лагеря дневного пребывания в школе для детей
  • Инструкции для лаборанта хим анализа
  • Инструкции для детского пришкольного лагеря