在 case 语句中退出查询?

the*_*r34 8 sql-server t-sql

我正在尝试设置一个查询,以便它比较来自两个不同表的两个日期,如果它们相等,则查询退出。如果它们不相等,则查询将继续并插入一些内容。但是,我不知道如何让它做我想做的事。

SELECT TOP(1) @dateA=a.someDate
FROM a
ORDER BY DESC;
SELECT TOP(1) @dateB=b.someDate
FROM b
ORDER BY DESC;

CASE WHEN @dateA=@dateB THEN raiseerror('dates equal',20,-1) with log;

Insert statements;
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激。

Aar*_*and 16

CASE 是一个表达式(不是语句),不能用于像这样的流控制 - 不调用命令,不返回多个列/值,不单独用作命令。

在我看来,IF当日期相等时,您可以使用它来引发错误,否则运行插入。

IF @dateA = @dateB 
BEGIN
  raiseerror('dates equal',20,-1) with log;
END
ELSE -- maybe you don't need a batch-aborting, logging error level
BEGIN
  INSERT ...
END
Run Code Online (Sandbox Code Playgroud)

你也可以用另一种方式来做。仅当日期不相等时才运行插入,否则会引发错误:

IF @dateA <> @dateB
BEGIN
  INSERT ...
END
ELSE
BEGIN
  raiserror ...
END
Run Code Online (Sandbox Code Playgroud)

如果你认为使用错误为获得运行插件出来的目的,那么你可以只从去除一切ELSE下来,因为刀片将运行的唯一途径是,当@dateA@dateB不相等的

IF @dateA <> @dateB
BEGIN
  INSERT ...
END
Run Code Online (Sandbox Code Playgroud)

我已经缩减了对行(与“记录”)和列(与“字段”)之类的东西的迂腐,但整个表达式与语句是一个非常重要的区别,正是出于这个原因。请参阅“ CASE 表达式的肮脏秘密”。


Ken*_*her 6

使用一个IF而不是一个CASE

 IF @dateA=@dateB 
    raiseerror('dates equal',20,-1) with log;
 ELSE
    BEGIN
        Insert statements;
    END
Run Code Online (Sandbox Code Playgroud)

这当然假设您确实想要引发错误。另一种选择是:

 IF @dateA<>@dateB 
    BEGIN
        Insert statements;
    END
Run Code Online (Sandbox Code Playgroud)

现在,请注意BEGINEND。这些将很重要。该IF声明(和ELSE)只影响它下面的命令权。如果您需要多个命令,则需要一个 BEGIN 和一个 END