pri*_*kar 23 sql t-sql sql-server sql-server-2005 common-table-expression
昨晚我写的是一个简单的T-SQL程序
DECLARE @ROLEID AS INT
SELECT @ROLEID = [ROLE ID] FROM TBLROLE
;WITH CTE
AS
(
SELECT * FROM SOMETABLE
)
IF (@ROLEID = 1)
BEGIN
//SOMECODE
END
ELSE IF(@ROLEID = 2)
BEGIN
//SOMECODE
END
ELSE
BEGIN
//SOMECODE
END
Run Code Online (Sandbox Code Playgroud)
我在编译后发现它抛出的错误类似于"如果附近有错误的语句"
怎么了?
但是,我通过使用其他方式做到了这一点.但我想知道为什么它不起作用!
Rem*_*anu 24
公用表表达式在单个语句的上下文中定义:
WITH cte_name AS (
<cte definition>)
<statement that uses cte>;
Run Code Online (Sandbox Code Playgroud)
所以你可以这样做:
WITH CTE
AS
(
SELECT * FROM SOMETABLE
)
SELECT * FROM CTE;
Run Code Online (Sandbox Code Playgroud)
要么
WITH CTE
AS
(
SELECT * FROM SOMETABLE
)
UPDATE CTE
SET somefield = somevalue
WHERE id = somekey;
Run Code Online (Sandbox Code Playgroud)
CTE后面必须跟一个引用部分或全部CTE列的SELECT,INSERT,UPDATE,MERGE或DELETE语句.CTE也可以在CREATE VIEW语句中指定,作为视图的定义SELECT语句的一部分
gbn*_*gbn 10
你最接近的是使用UNION ALL进行粗略切换选择:
DECLARE @ROLEID AS INT
SELECT @ROLEID = [ROLE ID] FROM TBLROLE
;WITH CTE
AS
(
SELECT * FROM SOMETABLE
)
SELECT
--somecolumns
FROM
CTE
--other stuff too
WHERE
@ROLEID = 1
UNION ALL
SELECT
--somecolumns
FROM
CTE
--other stuff too
WHERE
@ROLEID = 2
UNION ALL
SELECT
--somecolumns
FROM
CTE
--other stuff too
WHERE
@ROLEID = 3
...
UNION ALL
SELECT
--somecolumns
FROM
CTE
--other stuff too
WHERE
@ROLEID = n
Run Code Online (Sandbox Code Playgroud)
有点晚了,但我不能成为唯一一个碰到这个的人.
解决方案可能是创建一个这样的临时表:
-- If previous run of this query fails, the temp table will be deleted.
-- Selecting into creates the temp table which fails if it already exists
IF EXISTS(SELECT [name] FROM tempdb.sys.tables WHERE [name] like '#dtBalansOpgesteldGefilterd%') BEGIN
DROP TABLE #temp
END;
;WITH CTE
AS
(
SELECT * FROM SOMETABLE
)
-- Followed by select statement as required
SELECT *
INTO #temp
FROM CTE
IF @awsome = 1
BEGIN
SELECT 'WHATEVERYOUWANT' AS WhateverColumnNameYouWant, *
FROM #temp
END
Run Code Online (Sandbox Code Playgroud)