параметр пользовательской функции, который используется в IN()

arafikov
Дата: 16.01.2009 08:17:17
Microsoft SQL Server  2000 - 8.00.760 (Intel X86) 
Dec 17 2002 14:22:05
Copyright (c) 1988-2003 Microsoft Corporation
Developer Edition on Windows NT 5.1 (Build 2600: Service Pack 3)

Ситуация у меня такая. Я хочу сделать пользовательскую функцию вида:

CREATE FUNCTION SpisKategoryOld (@KATEG VARCHAR(8000)
)
RETURNS TABLE
AS RETURN
   (SELECT ss.KATEG
    FROM Rhtatn.dbo.SHTATED AS ss
    WHERE ss.KATEG IN (@KATEG))
т.е. я хочу передать в функцию через параметр набор, который выглядит так: 'ППС','УВП','АХЧ'.

Если я пишу
SELECT * FROM SpisKategoryOld('ППС','УВП','АХЧ')
то выходит ошибка: "Слишком много параметров".

Как мне сделать так, чтобы в функцию я передавал значение, которое мог бы подставить в IN()?
На входе имею строку 'ППС','УВП','АХЧ', каким образом преобразовать эту строку, чтобы ее можно было использовать в IN(), передавая в пользовательскую функцию?

Заранее спасибо!
tpg
Дата: 16.01.2009 08:21:33
Именно, одним параметром - '''ППС'',''УВП'',''АХЧ''' - как-то так, количест апострофов сами подберите.
arafikov
Дата: 16.01.2009 08:39:47
С апострофами не получается.
SELECT * FROM SpisKategoryOld('''ППС'',''УВП'',''АХЧ''')
Я исправил функцию так:
CREATE FUNCTION SpisKategoryNew (@KATEG VARCHAR(8000)
)
RETURNS @theTable TABLE(KATEG VARCHAR(100))
AS
BEGIN
  DECLARE @NEWKATEG VARCHAR(8000)

  SET @NEWKATEG=REPLACE(@KATEG,'"','''')

  INSERT @theTable
  SELECT ss.KATEG
    FROM Rhtatn.dbo.SHTATED AS ss
    WHERE ss.KATEG IN (@NEWKATEG)
  RETURN
END

и выполняю
SELECT * FROM SpisKategoryNew('"ППС","УВП","АХЧ"')

не работает, выдает пустую таблицу. Я так понял, в моем случае запрос в функции должен быть изначально в VARCHAR (я туда подставил бы @NEWKATEG), а затем преобразовываться из текста в настоящий запрос какой-то функцией... Это возможно?
tpg
Дата: 16.01.2009 08:42:24
Не... А вот в выражении IN() их уже надо "расцепить" - сделать именно: 'ППС','УВП','АХЧ'.
Вы бы лучше озвучили саму задачу а не первый пришедший на ум способ её решения.
arafikov
Дата: 16.01.2009 08:57:57
У меня задача такая: пользователь в клиенте на Delphi выбирает множество значений категорий из справочника.

Я создаю из выбранных значений строку вида ss='знач.1','знач.2','знач.3'.

У меня есть сложный SQL-запрос в ADOQuery вида: 'SELECT * FROM ... WHERE KATEG IN(<Категория>)'.

Я делаю adQ.SQL:=StringReplace(adQ.SQL.Text, '<Категория>',ss, [rfReplaceAll]). Такая конструкция работает нормально.

Для упрощения запроса я вынес все, что касается категорий в пользовательскую функцию. В adQ.SQL я пишу ''SELECT * FROM ... SpisKategoryNew(<Категория>).

Я и в этом случае хочу сделать adQ.SQL:=StringReplace(adQ.SQL.Text, '<Категория>',ss, [rfReplaceAll]). Вот здесь и появилась проблема передачи в функцию набора значений для IN.
arafikov
Дата: 16.01.2009 09:11:41
Спасибо за ссылку, буду изучать.