我有一个存储过程需要从两个数据库中的一个返回一些内容:
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
但这会导致语法错误。
我看到的两个选项都很可怕:
执行UNION
并确保只有一方有任何结果:
SELECT y FROM Table_A WHERE @x = 1 联盟 选择y FROM Table_B WHERE @x = 2
创建一个临时表来存储一行,并在每次运行此程序时创建并删除它(批次)。
这两种解决方案都不优雅,我认为它们的性能都很糟糕(除非MS SQL足够聪明,当WHERE类始终为false时不能搜索表)。
还有什么我可以做的吗?选项1不像我想的那么糟糕吗?
答案 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)
(好的,你可以有一个更好的错误信息,但那肯定会吓到我......)