将两个存储过程组合到一个存储过程获取错误

时间:2014-04-06 20:18:33

标签: sql sql-server stored-procedures

我有一个这样的存储过程:

ALTER procedure [dbo].[IBS_PodiumSummeryCount]
   @locid integer = null
as
begin
    SET NOCOUNT ON;

    SELECT 
       sum(status_receved) as Receved, 
       sum(status_parked) as Parked,
       sum(status_requested) as Requested,
       sum(status_requestedinprocess) as Requestinprocess
    FROM 
       (SELECT 
            CASE WHEN (status = 0 ) THEN 1 ELSE 0 END AS status_receved,
            CASE WHEN (status = 2) THEN 1 ELSE 0 END AS status_parked, 
            CASE WHEN (status = 3) THEN 1 ELSE 0 END AS status_requested,
            CASE WHEN (status = 4) THEN 1 ELSE 0 END AS status_requestedinprocess
        FROM 
            transaction_tbl 
        WHERE 
            locid = @locid AND dtime >= getdate()-1 AND status IN (0,2,3,4)) a;

    SELECT 
       l1.StartTime, CONVERT(VARCHAR, GETDATE(), 108) AS Time 
    FROM
       Location_tbl l1 
    WHERE 
       l1.Locid = @locid
END

我还有一个这样的存储过程:

select  dbo.podiumsummerytime(
                convert(decimal(10,1),
                    avg(convert(numeric(18,2), datediff(ss, t.dtime, t.PAICdate  ))))

            ) as Avgparkingtime,
           dbo.podiumsummerytime(
                convert(decimal(10,1),
                    avg(convert(numeric(18,2), datediff(ss, t.Paydate, t.DelDate ))))

            ) as AvgDelivarytime,
            dbo.podiumsummerytime(
                convert(decimal(10,1),
                    avg(convert(numeric(18,2), datediff(ss, t.dtime, t.DelDate ))))

            ) as Avgstaytime

            from (select top 30 * from transaction_tbl where locid=@locid and dtime >= getdate()-2 order by transactID desc ) t
            end

我尝试将这两个存储过程写在一个带有union的文件中,但我收到的错误是这样的:

  

使用UNION,INTERSECT或EXCEPT运算符组合的所有查询在其目标列表中必须具有相同数量的表达式。

我正在使用SQL Server 2008,如何将这两个存储过程合并到一个存储过程...

1 个答案:

答案 0 :(得分:2)

正如错误所述,UNION是一个特定的关键字用于获取两组结果的行。如果行不同,则它们不能与UNION连接。

没有什么可以阻止你将两个查询放在一个存储过程中,proc将返回两个结果集。

例如:

ALTER procedure [dbo].[IBS_PodiumSummeryCount]
    @locid integer = null
AS
BEGIN
    SELECT * FROM Customers WHERE Location = @Locid;

    SELECT * FROM Suppliers WHERE Location = @Locid;
END

将在单独的结果集中返回两个查询的结果。