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-