Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 是否有一种方法可以在一行上执行IF()求值和执行存储过程?_Sql Server_Tsql - Fatal编程技术网

Sql server 是否有一种方法可以在一行上执行IF()求值和执行存储过程?

Sql server 是否有一种方法可以在一行上执行IF()求值和执行存储过程?,sql-server,tsql,Sql Server,Tsql,有没有一种方法可以把它写在一行代码中 IF (ISNULL(@param1,'1') = '1' AND ISNULL(@param2,'') = '') exec sp_CheckNill @param2, '@param2 cannot be NULL if @param1 is NOT NULL' 对于不可避免的“为什么?”问题:除了更紧凑之外,如果我连续做了很多这样的事情,可读性要好得多,因为每行之间的个体差异更明显 编辑: 我是个白痴。一条线上的所有功能都能正常工作: IF

有没有一种方法可以把它写在一行代码中

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'

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

可以吗,是的。但是,您必须非常小心,因为空格的类型(返回与空格)不会影响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
,而不是第一个,不管格式如何


由于这些问题,许多公司都有严格的编码准则,禁止在没有明确的
BEGIN
END
语句(或在许多其他编程语言中使用大括号)的情况下使用
IF
s,这使得所有这些语句都很清楚。你必须自己决定如何避免这种混乱。

效果很好。真的,有时候你只需要试试

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

如果可读性是您唯一关心的问题,您是否考虑过将第二行缩进超过第一行的长度?这将使它成为一个之字形的阅读模式,但至少IF和EXEC将整齐排列,而不是“混合”。此外,如果你真的把它全部写在一行上会发生什么?我不确定我是否明白为什么你不能把它放在一行上。。。。把它移到另一行就行了:如果1=1,就打印“hi”,所以我不明白为什么你的代码不会。您是否收到错误?根据您传递给proc的消息,您的代码似乎没有正确的语义。你为什么不测试一下
@param1不为null,@param2为null
?这不像我的回答那么有趣。你确定
func3
的例子吗?我认为func3未与
condition1
,仅与
condition2
相关。(除非你是故意这样做的,以表明这确实令人困惑。为此脱帽致敬;)@ypercube:谢谢,我确实把自己弄糊涂了——这是一个很好的意外说明问题的例子。更正!你是如何制作和发布gif的?@tbone LICECap-