如何防止SQL Server返回3组结果?

时间:2013-10-16 19:00:18

标签: sql sql-server

我有一个存储过程,它调用其他2个存储过程来获取一些值。

ALTER PROCEDURE [dbo].[Delivery_SelectByJobID] 
(
    @job_ID int
)
as
-- if possible - if count(pods) > 0 return true
-- and           if count(photos) > 0 return true
declare @podCount int = 0;
declare @photoCount int = 0;

EXEC @podCount=countPodsForJob @job_ID
EXEC @photoCount =countPhotosForJob @job_ID

declare @podsBit bit=0
declare @photosBit bit=0

if @podCount > 0
    begin
set @podsBit = 1
    end

if @photoCount > 0
    begin
    set @photosBit = 1
    end

SELECT     Job_Reference_No, Job_Start_Date, Job_POD_Filename, Job_Photo_Filename, 
Job_Signed_For_Name, Job_ID, Job_Status, Job_Delivery_Notes, @podsBit as Job_POD_Supplied, 
                      @photosBit as Job_Photo_Supplied
FROM         Jobs
WHERE     (Job_ID = @Job_ID) AND (Job_Status <> 7)

当我运行它时,它返回3组结果,即Count_pods,Count_Photos和select的结果。 我只想返回select的结果。 如何停止返回其他结果?

3 个答案:

答案 0 :(得分:1)

解决了这个问题。

我需要将countPodsForJob和countPhotosForJob转换为返回值而不是结果集的函数。

答案 1 :(得分:0)

您可以使用

SET NOCOUNT ON;    ---- after the AS in your proc's Definition.

它将停止发送消息为12行......

检查其他存储过程的定义,并对它们执行相同的操作.....
事实上,我刚刚注意到你的嵌套存储过程和变量@prodCount和@PhotoCount的返回值使它们 OUTPUT参数,这将存储它们传递参数的值,然后你可以传递它们OUT参数给你SELECT语句。

一旦你改变了嵌套过程的定义,你就可以做这样的事情。

 ALTER PROCEDURE [dbo].[Delivery_SelectByJobID] 
    (
        @job_ID int
    )
    as
    SET NOCOUNT ON;
    -- if possible - if count(pods) > 0 return true
    -- and           if count(photos) > 0 return true
    declare @podCount int = 0;
    declare @photoCount int = 0;

    --EXEC @podCount=countPodsForJob @job_ID          --Your Code
    --EXEC @photoCount =countPhotosForJob @job_ID     --Your Code

    EXEC countPodsForJob @job_ID, @podCount OUTPUT         --My Suggestion
    EXEC countPhotosForJob @job_ID, @photoCount OUTPUT     --My Suggestion

    declare @podsBit bit=0
    declare @photosBit bit=0

    if @podCount > 0
        begin
    set @podsBit = 1
        end

    if @photoCount > 0
        begin
        set @photosBit = 1
        end

    SELECT     Job_Reference_No, Job_Start_Date, Job_POD_Filename, Job_Photo_Filename, 
    Job_Signed_For_Name, Job_ID, Job_Status, Job_Delivery_Notes, @podsBit as Job_POD_Supplied, 
                          @photosBit as Job_Photo_Supplied
    FROM         Jobs
    WHERE     (Job_ID = @Job_ID) AND (Job_Status <> 7)

答案 2 :(得分:0)

您的存储过程countPodsForJobcountPhotosForJob会返回自己的结果集。如果传递了特定参数,或者(更好的选择)将其替代方法创建为标量UDF,您可以重写它们执行SELECT。

另一种替代方法(如果您无法控制现有SP并且无法创建新功能)很容易忽略调用者应用程序中的其他结果集。 (例如,在ADO.NET DataSet中,您可以简单地获取第3个DataTable)。