Функция SQL Table Valued - возвращает определенные данные из 'WITH' на основе значения параметра - PullRequest
0 голосов
/ 30 сентября 2019

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

WITH StuffChain 
AS (
   //initial
    union all
   //more
)

После этого я пытаюсь сделать что-то вроде

CASE WHEN @MyParamVal = 1 THEN
      SELECT TOP (1) * FROM StuffChain
ELSE
      SELECT * FROM StuffChain
END
RETURN

SQL не моя сила, и я все еще учусь, извините. Я также не уверен, использовать ли встроенную функцию или функцию с несколькими выражениями

РЕДАКТИРОВАТЬ: Когда я даю дело, я использую его, чтобы объяснить, что я хочу вернуть, а не обязательно то, что я буду использовать. Я использую это, чтобы просто описать то, что мне нужно, используя то, что мало знаю, если это имеет смысл.

Ответы [ 3 ]

5 голосов
/ 30 сентября 2019

Прежде всего, использование TOP без ORDER BY несколько бессмысленно, поскольку не обеспечивает порядок, в котором можно выбрать первые несколько строк. В этом случае мы можем попробовать использовать ROW_NUMBER для управления порядком:

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (ORDER BY some_col) rn
    FROM StuffChain
)

SELECT *
FROM cte
WHERE
    (rn = @MyParamVal) OR (@MyParamVal <> 1);
1 голос
/ 30 сентября 2019

Вы можете сделать следующим образом. Это только одно из решений. Вы можете сделать и со многими другими способами.

WITH StuffChain 
AS (
   //initial
    union all
   //more
)

После создания CTE попробуйте следующее

SELECT TOP (CASE WHEN @MyParamVal = 1 THEN 1 ELSE 
    (SELECT COUNT(1) FROM StuffChain) END  *
FROM StuffChain
order by <column> <ASC/DESC>;
0 голосов
/ 30 сентября 2019

Мы можем использовать переменную таблицы, например, Declare @TEMP Table (intcol int,...) внутри функции.

Declare @TEMP Table (intcol int,...)

WITH StuffChain 
AS (
   //initial
    union all
   //more
)
SELECT * INTO @TEMP FROM StuffChain;

--do what ever you want with temp table
...