有没有办法在一行中执行 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
关联,而不是第一个,尽管格式看起来如此。
由于这些问题,许多公司都有严格的编码指南,禁止在没有显式 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 (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
关联,而不是第一个,尽管格式看起来如此。
由于这些问题,许多公司都有严格的编码指南,禁止在没有显式 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