代码之家  ›  专栏  ›  技术社区  ›  Gil

TSQL:如果在存储过程内部[已关闭],则查询不返回行

  •  0
  • Gil  · 技术社区  · 12 年前

    我有一个查询需要一些参数。

    在SQLServerManagementStudio的标准查询屏幕上执行它时,它的工作原理与预期一样,大约15秒后返回一些数据行。这是一个复杂的查询。

    但是在存储过程中执行它只返回标头,而不返回任何数据行。

    此外,它的执行最多只需要1~2秒。

    没有返回或显示错误。

    它的方面是这样的:

    CREATE PROCEDURE [dbo].[sp_StoreProcedure]
        @FDId INT
        , @Year INT
        , @NDate DATETIME
        , @SDate DATETIME
        , @MId INT
    AS
    BEGIN
        SET NOCOUNT ON;
    
        SELECT of complex query
    END
    

    它的调用很简单:

    DECLARE @FDId INT
    DECLARE @Year INT
    DECLARE @NDate DATETIME
    DECLARE @SDate DATETIME
    DECLARE @MId INT
    
    SET @FDId = 926
    SET @Year = 2012
    SET @NDate = '1900-01-01'
    SET @SDate = GetDate()
    SET @MId = 1
    
    EXEC [outsystems].[dbo].[sp_StoreProcedure]
        @FDId
        , @Year
        , @SDate
        , @NDate
        , @MId
    

    但它返回一个空表。

    这怎么可能呢? 我能做些什么来修复它?

    编辑-->复杂查询有24个联接。在这里展示它将是巨大的。

    1 回复  |  直到 12 年前
        1
  •  2
  •   Bridge user2173966    12 年前

    真的很容易犯错误。

    当您声明存储过程时:

    CREATE PROCEDURE [dbo].[sp_StoreProcedure]
        @FDId INT
        , @Year INT
        , @NDate DATETIME
        , @SDate DATETIME
        , @MId INT
    

    执行时,您没有在正确的顺序位置传递参数:

    EXEC [outsystems].[dbo].[sp_StoreProcedure]
        @FDId
        , @Year
        , @SDate
        , @NDate
        , @MId
    

    请注意 SDate NDate 在调用过程时是相反的。

    这应该起作用:

    EXEC [outsystems].[dbo].[sp_StoreProcedure]
        @FDId
        , @Year
        , @NDate
        , @SDate
        , @MId
    

    如果您在执行时指定了哪个参数是哪个(而不是依赖于序数位置),这就不会是一个问题,这将是一个更好的想法。