我正在尝试设置一个查询,以便它比较来自两个不同表的两个日期,如果它们相等,则查询退出。如果它们不相等,则查询将继续并插入一些内容。但是,我不知道如何让它做我想做的事。
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 表达式的肮脏秘密”。
使用一个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)
现在,请注意BEGIN和END。这些将很重要。该IF声明(和ELSE)只影响它下面的命令权。如果您需要多个命令,则需要一个 BEGIN 和一个 END。
| 归档时间: |
|
| 查看次数: |
3650 次 |
| 最近记录: |