你放的
在…内
函数,因为这就是语句的位置。
大概
(您没有显示您的尝试)您尝试过
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