首页 > 解决方案 > 尝试将 CTE 用于 IF

问题描述

如果遇到触发器,我将使用 SQL 作为自动化过程的一部分来运行重新编译。我需要为自动化软件输出数字“0”或数字“2”。我已经编写了以下查询并且它有效,但我正在努力发展我的知识,所以有几个问题......

在下文中,我使用的是 CTE 还是子查询?另外,这个简单的查询可以改进吗?

USE ErrorLog
GO

DECLARE @Rslt AS INT

SET @Rslt = (
SELECT COUNT(*)
  FROM [ErrorLog].[dbo].[ErrorLog]
  WHERE system = 'BEMA' AND Message LIKE 'Timeout expired%'
  AND errDate > DATEADD(MINUTE, -15, CURRENT_TIMESTAMP))

IF 
    (@Rslt > '0')
    BEGIN
        SELECT 2
    END
ELSE 
    BEGIN
        SELECT 0
    END

标签: sql-servertsqlcountcommon-table-expression

解决方案


可以直接返回结果:

SELECT IIF(COUNT(*) > 0, 2, 0)
FROM [ErrorLog].[dbo].[ErrorLog]
WHERE system = 'BEMA' AND Message LIKE 'Timeout expired%'
    AND errDate > DATEADD(MINUTE, -15, CURRENT_TIMESTAMP))

或直接分配:

DECLARE @Rslt AS INT

SELECT @Rslt = IIF(COUNT(*) > 0, 2, 0)
FROM [ErrorLog].[dbo].[ErrorLog]
WHERE system = 'BEMA' AND Message LIKE 'Timeout expired%'
    AND errDate > DATEADD(MINUTE, -15, CURRENT_TIMESTAMP))

ASIIF在 SQL Server 2012 中可用,您需要在CASE WHEN以前的版本中使用。


推荐阅读