You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在T-SQL函数中正确放置并使用多个WITH子句?

如何在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 = (
                        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子句放在函数声明前、BEGIN之后还是SELECT语句前,都会出现语法错误。

最终解决方案

经过调整,正确的写法是将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

内容的提问来源于stack exchange,提问作者MyselfAndOnlyMe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 13:58:23