Использование CASE вне SELECT в табличной функции - PullRequest
0 голосов
/ 14 мая 2018

Я пытаюсь выбрать те же столбцы из другой таблицы / представления в зависимости от значения аргумента (@ruleset). Поскольку невозможно передать имя таблицы в качестве параметра или создать имя внутри функции, используется структура CASE вне операторов выбора. Однако я получаю ошибку: «В списке выбора можно указать только одно выражение, если подзапрос не введен с EXISTS». [Надеюсь, я правильно понял, это мой первый вопрос здесь.]

CREATE FUNCTION app.fgProduct 
(   
    @ruleset nvarchar(50),
    @matno nvarchar(50), 
    @datarevision int
)
RETURNS TABLE 
AS
RETURN 
(
SELECT
CASE WHEN @ruleset = 'G1' THEN 
(
  SELECT 
    @matno AS ProductId
    ,@datarevision AS DataRevision
    ,[ProductName]
  FROM [ruleset].[g1gxProduct]
  WHERE ProductId = @matno
)
WHEN @ruleset = 'G2' THEN 
(
  SELECT 
    @matno AS ProductId
    ,@datarevision AS DataRevision
    ,[ProductName]
  FROM [ruleset].[g2gxProduct]
  WHERE ProductId = @matno
)
END
)

Существует множество других представлений, поэтому эту проблему невозможно решить за одну процедуру. Выше приведен пример функции, которая используется для генерации новых записей на основе различных наборов правил (= наборов представлений).

Ответы [ 3 ]

0 голосов
/ 14 мая 2018

Ошибка связана с операторами выбора, которые возвращают более одного столбца в подзапросе.Вы можете вернуть только один столбец в выражениях:

SELECT 
    @matno AS ProductId
    ,@datarevision AS DataRevision
    ,[ProductName]
0 голосов
/ 15 мая 2018

Решение состоит в том, чтобы объявить таблицу результатов и вставить в нее, так же, как @EzLo предложил в комментарии.

CREATE FUNCTION app.fgProduct 
(   
  @ruleset nvarchar(50),
  @matno nvarchar(50), 
  @datarevision int
)
RETURNS @ret TABLE (
  [ProductID] [nvarchar](50) NOT NULL,
  [DataRevision] [int] NOT NULL,
  [ProductName] [nvarchar](50) NULL
)
AS
BEGIN
IF @ruleset = 'G1'
  INSERT INTO @ret 
  SELECT 
    @matno AS ProductId
    ,@datarevision AS DataRevision
    ,[ProductName]
  FROM [ruleset].[g1gxProduct]
  WHERE ProductId = @matno
ELSE
IF @ruleset = 'G2'
  INSERT INTO @ret 
  SELECT 
    @matno AS ProductId
    ,@datarevision AS DataRevision
    ,[ProductName]
  FROM [ruleset].[g2gxProduct]
  WHERE ProductId = @matno
RETURN
END
0 голосов
/ 14 мая 2018

CASE является выражением, а не для условного потока.Вместо этого используйте IF / ELSE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...