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

tbo*_*one -3 t-sql sql-server

有没有办法写这个,所以它可以在一行代码上?

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

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

编辑:

我是个白痴.所有在一行上确实有效:

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

我删除了这个问题,除了下面的@James发布了一个内容丰富的相关答案.

Jam*_*mes 5

可以吗,是的.但是,您必须非常小心,因为空格的类型(返回与空格)不会影响SQL(或大多数编程语言).通过将一个IF陈述的正文放在同一条线上,你可以欺骗你后来的自己或其他人认为这个空白实际上有所作为(即使你有意识地知道它没有).

这里有些例子:

IF @condition=1 EXEC func1 EXEC func2
Run Code Online (Sandbox Code Playgroud)

将始终执行func2,即使从格式化它似乎是一部分IF.

ELSE 条款增加了混乱:

IF @condition1=1
    IF @condition2=1 EXEC func1
ELSE EXEC func2
Run Code Online (Sandbox Code Playgroud)

在这种情况下,func2如果@ contition1为零,则不会执行.它只会在@ condition1为1且@ condition2不为1时执行,因为ELSE它与第二个IF而不是第一个绑定,尽管格式化使它看起来像.

由于这些问题,许多公司都有严格的编码指南,禁止在IF没有明确BEGINEND陈述的情况下使用s (或者在许多其他编程语言的情况下使用括号),这使得所有这些陈述都清楚.你必须自己决定如何避免这种混乱.

  • 这不像我的回答那么有趣. (3认同)