有没有办法在一行中执行 IF() 评估和执行存储过程?

Is there a way to perform an IF() evaluation and execute a stored procedure all on one line?

有没有办法把它写成一行代码?

IF (ISNULL(@param1,'1') = '1' AND ISNULL(@param2,'') = '') 
   exec sp_CheckNill @param2, '@param2 cannot be NULL if @param1 is NOT NULL'

对于不可避免的"why?"问题:除了更紧凑之外,如果我连续做很多这样的事情,可读性会好得多,因为每行之间的个体差异更加明显。

编辑:

我是个白痴。全部在一条线上确实有效:

IF (ISNULL(@param1,'1') = '1' AND ISNULL(@param2,'') = '') exec sp_CheckNill @param2, '@param2 cannot be NULL if @param1 is NOT NULL'

我会删除这个问题,除了下面的@James 发布了一个信息丰富的相关答案。

可以吗,可以。不过,您必须非常小心,因为空格的类型(returns 与空格)不会影响 SQL(或大多数编程语言)。通过将 IF 语句的主体放在同一行,您可能会欺骗后来的自己或其他人,让他们认为空格实际上有所不同(即使您有意识地知道它没有)。

这里有一些例子:

IF @condition=1 EXEC func1 EXEC func2

将始终执行 func2,即使从格式来看它似乎是 IF.

的一部分

ELSE 子句更加混乱:

IF @condition1=1
    IF @condition2=1 EXEC func1
ELSE EXEC func2

在这种情况下,如果@contition1 为零,func2 将不会执行。它只会在 @condition1 为 1 且 @condition2 不为 1 时执行,因为 ELSE 与第二个 IF 关联,而不是第一个,尽管格式看起来如此。

由于这些问题,许多公司都有严格的编码指南,禁止在没有显式 BEGINEND 语句(或许多其他情况下的大括号)的情况下使用 IFs编程语言),这使得所有这些陈述变得清晰。您必须自己决定如何避免这种混淆。

工作正常。真的,有时候你只需要尝试一下

CREATE PROCEDURE dbo.sp_CheckNill
(
    @p0 varchar(30)
,   @p1 varchar(30)
)
as
BEGIN
    SET NOCOUNT ON;
    PRINT 'This works';
END
GO
DECLARE
    @param1 char(1)
,   @param2 varchar(30);

IF (ISNULL(@param1,'1') = '1' AND ISNULL(@param2,'') = '') 
   exec sp_CheckNill @param2, '@param2 cannot be NULL if @param1 is NOT NULL';

IF (ISNULL(@param1,'1') = '1' AND ISNULL(@param2,'') = '') EXEC sp_CheckNill @param2, '@param2 cannot be NULL if @param1 is NOT NULL';

结果

This works
This works