Попытка использовать CTE для IF - PullRequest
0 голосов
/ 04 октября 2019

Я использую 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

1 Ответ

0 голосов
/ 04 октября 2019

Вы можете вернуть результат напрямую:

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))

AS IIF доступен из SQL Server 2012, вам необходимо использовать CASE WHEN для предыдущих версий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...