jua*_*han 5 sql-server sql-server-2012
我正在尝试使用WITH
子句和IF
语句,但它似乎不起作用,我找不到任何原因。语法应该是正确的,但它仍然在抱怨语法。
我收到的错误是“';'附近的语法不正确。我尝试删除;
字符,但后来显示“关键字'IF'附近的语法不正确。
甚至可以像这样使用 WITH 和 IF 语法吗?该查询在没有IF
语句的情况下也能工作(只有一个选择查询)。
With measurements as
(
(SELECT * from measurement_database1)
UNION ALL
(SELECT * from measurement_database2)
UNION ALL
(SELECT * from measurement_database3)
);
IF @device= 'en1' AND @other_parameter= 'yes'
(
select * from measurements where device like 'en1' and op like 'yes'
);
IF @device= 'en2' AND @other_parameter= 'no'
(
select * from measurements where device like 'en2' and op like 'no'
);
IF @device= 'en3' AND @other_parameter= 'yes'
(
select * from measurements where device like 'en3' and op like 'yes'
);
Run Code Online (Sandbox Code Playgroud)
我正在运行 Microsoft SQL Server 2012 11.0.6607.3。
Sha*_*eis 15
如果您考虑一下,它可能会帮助您更多,而不是作为 WITH 语句,而是作为公共表表达式 (CTE)。
这样你就可以回到CTE 上的 Microsoft 文档并阅读以下行;
CTE 后面必须跟一个引用部分或全部 CTE 列的 SELECT、INSERT、UPDATE 或 DELETE 语句。CTE 也可以在 CREATE VIEW 语句中指定为视图的定义 SELECT 语句的一部分。
尽管从技术上讲,您可以定义 CTE,然后根本不引用它,但是定义它有什么意义呢?例如
WITH Missing AS (SELECT 'The Point' AS What)
SELECT * FROM sys.messages;
Run Code Online (Sandbox Code Playgroud)
回到你的案例,你可以使用CASE
语句而不是语句来重写它,IF
但又有什么意义呢?你不需要它们。
您的查询可以重写为:
DECLARE @device char(3) = 'en3',
@other_parameter varchar(3) = 'yes';
WITH measurements AS (
(SELECT *
FROM measurement_database1)
UNION ALL
(SELECT *
FROM measurement_database2)
UNION ALL
(SELECT *
FROM measurement_database3)
)
SELECT *
FROM measurements
WHERE device LIKE @device
AND op LIKE @other_parameter;
Run Code Online (Sandbox Code Playgroud)
所以根本不需要IF
声明!HTH