IF / ELSE使存储过程不返回结果集

时间:2010-06-02 19:02:52

标签: sql sql-server stored-procedures

我有一个存储过程需要从两个数据库中的一个返回一些内容:

IF @x = 1
    SELECT y FROM Table_A
ELSE IF @x = 2
    SELECT y FROM Table_B

单独SELECT将返回我想要的内容,但添加IF / ELSE会使其停止返回任何内容。我试过了:

IF @x = 1
    RETURN SELECT y FROM Table_A
ELSE IF @x = 2
    RETURN SELECT y FROM Table_B

但这会导致语法错误。

我看到的两个选项都很可怕:

  1. 执行UNION并确保只有一方有任何结果:

    SELECT y FROM Table_A WHERE @x = 1 联盟 选择y FROM Table_B WHERE @x = 2

  2. 创建一个临时表来存储一行,并在每次运行此程序时创建并删除它(批次)。

  3. 这两种解决方案都不优雅,我认为它们的性能都很糟糕(除非MS SQL足够聪明,当WHERE类始终为false时不能搜索表)。

    还有什么我可以做的吗?选项1不像我想的那么糟糕吗?

2 个答案:

答案 0 :(得分:3)

你确定@x是1还是2?

declare @x int

set @x = 1

IF @x = 1
    SELECT 'syscolumns',* FROM syscolumns
ELSE IF @x = 2
    SELECT 'sysobjects',* from sysobjects
    else
    select 'not 1 or 2'

BTW该行应该做什么

SELECT @y FROM Table_B

它将返回相同的变量@y,无论你在TableB中有多少行

基于你的评论,0表示成功,proc没有错误输出。不要使用return语句,而是使用输出参数

基于你的第二个评论你可以使用这个,注意这只会在proc中起作用,因为内联sql不能使用return语句

declare @y int,@x int
select @y = -500


IF @x = 1
    SELECT  @y = y FROM Table_A
ELSE IF @x = 2
    SELECT  @y = y FROM Table_B

return @y

答案 1 :(得分:3)

一些想法:

首先,为什么“其他”?

IF @x = 1 
    SELECT y FROM Table_A 
IF @x = 2 
    SELECT y FROM Table_B 

应该做你想要的,不用担心嵌套,块声明(BEGIN / END)等。

第二,@x是否为空?如果是,则两个查询都不会运行。

第三,对于一个“可怕的消息”,在上面的两行之后添加这样的东西:

IF isnull(@x, 0) not in (1,2)
    RAISERROR('Data invalid, reformatting C:\', 20, 1)

(好的,你可以有一个更好的错误信息,但那肯定会吓到我......)