如何在 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 之前。
您将它们放在函数内部,因为这就是语句所在的位置。 大概(您没有显示您的尝试)您尝试了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
)