在T-SQL函数中执行多个WITH子句

问题描述 投票:0回答:1

如何在 T-SQL 函数中包含多个WITH 子句?

所以我有这些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 = (
                        SELECT
                            c.firstdecimal
                        FROM
                            c as c
                      )
RETURN @MyVariable
END GO

我必须将WITH 子句放在哪里?无论我把它们放在哪里,都会出现语法错误。在我的函数声明之前,在 de 开始之后,在括号中的 select 之前。

sql sql-server function t-sql with-clause
1个回答
0
投票

您将它们放在函数内部,因为这就是语句所在的位置。 大概(您没有显示您的尝试)您尝试了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 ), b AS ( SELECT * FROM ( SELECT big switch case FROM dbo.myotherdb LEFT JOIN dbo.anotherone WHERE condition) --Alias goes here ), c AS ( SELECT a.* FROM a LEFT JOIN b ) 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 ), b AS ( SELECT * FROM ( SELECT big switch case FROM dbo.myotherdb LEFT JOIN dbo.anotherone WHERE condition) --Alias goes here ), c AS ( SELECT a.* FROM a LEFT JOIN b ) SELECT c.firstdecimal FROM c; GO

© www.soinside.com 2019 - 2024. All rights reserved.