2012-03-29 39 views
0

我有一个存储过程,它将某些数据合并并返回。 SP最多会返回我3行,满足条件。即使条件不匹配,总是会返回UNION中的一些原始码

有没有一种方法可以强制SP返回空行,如果没有与条件相匹配的数据?

这是我的SP的样子:

SELECT Top 1 Col1, 'FirstResult' FROM Table T1 
     where SomeColumn='whatever' 

UNION ALL 

SELECT Top 1 Col2, 'SecondResult' FROM Table T1 
     where SomeColumn='whatever' 

UNION ALL 

SELECT Top 1 Col3, 'ThirdResult' FROM Table T1 
     where SomeColumn='whatever' 

我要永远回我3行不管即使条件犯规匹配。当然,结果集中的数据将为空或NULL

+1

这听起来像是应该在GUI中完成的事情,而不是存储过程(甚至是代码的业务逻辑)。只是我的$ .02。 – 2012-03-29 16:58:32

回答

1

你可以去这里证明,在这个答案的查询工作,没有行:http://www.sqlfiddle.com/#!3/51d1c/3

随着1行中YourTable:http://www.sqlfiddle.com/#!3/ad1e8/1

下面是应该回到你正在寻找的过程:

CREATE PROCEDURE pExample_Get3ForcedRows 
    @FirstMatch VARCHAR(50) 
    ,@SecondMatch VARCHAR(50) 
    ,@ThirdMatch VARCHAR(50) 
AS 
BEGIN 

DECLARE @ForceTable TABLE 
(
    MatchColumn VARCHAR(50) NOT NULL 
) 

INSERT @ForceTable (MatchColumn) VALUES (@FirstMatch),(@SecondMatch),(@ThirdMatch) 

SELECT 
    T.Col1 
    , T.ResultColumn 
FROM @ForceTable F 
LEFT JOIN YourTable T 
    ON T.SomeColumn = F.MatchColumn 

END 
GO 
0
DECLARE @table (Col1 varchar, String2 varchar) 

IF ((SELECT COUNT(*) FROM Table T1 WHERE SomeColumn='whatever')>0) 
    INSERT INTO @table 
    SELECT Top 1 Col1, 'FirstResult' FROM Table T1 WHERE SomeColumn='whatever' 
ELSE 
    INSERT INTO @table 
    SELECT NULL AS Col1, '' 

IF ((SELECT COUNT(*) FROM Table T1 WHERE SomeColumn='whatever')>0) 
    INSERT INTO @table 
    SELECT Top 1 Col2, 'secondResult' FROM Table T1 WHERE SomeColumn='whatever' 
ELSE 
    INSERT INTO @table 
    SELECT NULL AS Col2, '' 

IF ((SELECT COUNT(*) FROM Table T1 WHERE SomeColumn='whatever')>0) 
    INSERT INTO @table 
    SELECT Top 1 Col3, 'thirdResult' FROM Table T1 WHERE SomeColumn='whatever' 
ELSE 
    INSERT INTO @table 
    SELECT NULL AS Col3, '' 

RETURN @table 

不知道是否有更优雅的版本,但这应该工作。

相关问题