Выполнение нескольких предложений With внутри функции T-SQL

Как включить несколько предложений 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

Несовпадающие круглые скобки в первом запросе. У вас есть 7 скобок.

Bart McEndree 08.05.2024 16:04

не используйте DECIMAL без точности/размера, это должно быть DECIMAL(19,12) или что вы хотите

siggemannen 08.05.2024 16:12
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
2
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы помещаете их внутри функции, поскольку именно там находится оператор. Предположительно (вы не показываете свои попытки) вы попробовали 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

Другие вопросы по теме