Как включить несколько предложений With в функцию T-SQL?
Итак, у меня есть предложения With:
WITH a AS (
SELECT
*
FROM
dbo.mydb
WHERE
condition
),
b AS (
SELECT
*
FROM (
SELECT
big switch case
FROM
dbo.myotherdb
LEFT JOIN
dbo.anotherone
WHERE
condition
),
c AS (
SELECT
a.*
FROM
a
LEFT JOIN
b
)
Теперь я хотел бы использовать предложение c внутри функции как таковой:
CREATE FUNCTION dbo.MyFunction() RETURNS DECIMAL
AS BEGIN
DECLARE @MyVariable DECIMAL
SET @MyVariable = (
CASE
WHEN (
SELECT TOP(1) c.something
FROM c AS c
) IS NOT NULL THEN 1
WHEN (
SELECT TOP(1) c.something
FROM c AS c
WHERE c.something = 2
) IS NOT NULL THEN 2 - dbo.otherfunction()
END)
RETURN @MyVariable
END GO
Где мне нужно поместить предложения With? Куда бы я их ни поместил, я получаю синтаксическую ошибку. Перед объявлением моей функции, внутри после начала, перед выбором в скобках.
Обновлено: я изменил свой пример функции, чтобы он больше походил на реальную проблему, с которой я столкнулся. Вместо оператора выбора мне нужно выполнить случай переключения.
Хорошо, вот какое решение было:
CREATE FUNCTION dbo.MyFunction() RETURNS DECIMAL
AS BEGIN
DECLARE @MyVariable DECIMAL
WITH a AS (
SELECT
*
FROM
dbo.mydb
WHERE
condition
),
b AS (
SELECT
*
FROM (
SELECT
big switch case
FROM
dbo.myotherdb
LEFT JOIN
dbo.anotherone
WHERE
condition
),
c AS (
SELECT
a.*
FROM
a
LEFT JOIN
b
)
SELECT @MyVariable = (
CASE
WHEN (
SELECT TOP(1) c.something
FROM c AS c
) IS NOT NULL THEN 1
WHEN (
SELECT TOP(1) c.something
FROM c AS c
WHERE c.something = 2
) IS NOT NULL THEN 2 - dbo.otherfunction()
END)
RETURN @MyVariable
END GO
не используйте DECIMAL без точности/размера, это должно быть DECIMAL(19,12) или что вы хотите


Вы помещаете их внутри функции, поскольку именно там находится оператор. Предположительно (вы не показываете свои попытки) вы попробовали WITH CTE AS (...) SET @Variable..., однако за CTE не может следовать SET, это должен быть оператор SELECT или DML. У вас также есть синтаксическая ошибка в вашем CTE, поскольку вы не закрываете круглые скобки для производной таблицы и не даете ей имени.
Если исправить это, это будет выглядеть так:
CREATE FUNCTION dbo.MyFunction ()
RETURNS decimal --(p,s) required
AS BEGIN
DECLARE @MyVariable decimal; --(p,s) required
WITH
a AS
(SELECT *
FROM dbo.mydb
WHERE condition = 1),
b AS
(SELECT *
FROM (SELECT bigswitch AS cased
FROM dbo.myotherdb
LEFT JOIN dbo.anotherone ON 1 = 1
WHERE condition = 1) a
),
c AS
(SELECT a.*
FROM a
LEFT JOIN b ON 1 = 1)
SELECT @MyVariable = c.firstdecimal
FROM c;
RETURN @MyVariable;
END;
GO
Хотя это вряд ли хорошая идея, вместо этого используйте встроенную функцию табличного значения:
CREATE FUNCTION dbo.MyFunction ()
RETURNS table
AS
RETURN WITH
a AS
(SELECT *
FROM dbo.mydb
WHERE condition = 1),
b AS
(SELECT *
FROM (SELECT big AS switchcase
FROM dbo.myotherdb
LEFT JOIN dbo.anotherone ON 1 = 1
WHERE condition = 1) a --Alias goes here
),
c AS
(SELECT a.*
FROM a
LEFT JOIN b ON 1 = 1)
SELECT c.firstdecimal
FROM c;
GO
Несовпадающие круглые скобки в первом запросе. У вас есть 7 скобок.