【问题标题】:TSQL : query does not return rows if inside stored procedure [closed]TSQL:如果在存储过程中,查询不会返回行[关闭]
【发布时间】:2013-03-06 16:54:45
【问题描述】:

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

在 SQL Server Management Studio 的标准查询屏幕上执行它就像预期的那样在大约 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

但它返回一个空表。

这怎么可能? 我能做些什么来解决它?

edit --> 复杂查询有 24 个连接。在这里展示它会是巨大的。

【问题讨论】:

  • 错误可能在complex query 某处。也许如果您实际显示查询,有人将能够指出问题。
  • 我们需要真正看到查询,它可能很简单,比如您的参数之一没有在查询文本中使用,因此它不返回任何结果,但没有看到它,没有人能说出来。
  • 为什么不使用临时表来跟踪结果呢?这样您就可以找到记录消失的位置。
  • 这就是为什么你应该命名你的参数而不是依赖于序数位置。
  • 旁注:您应该为您的存储过程使用sp_ 前缀。微软有reserved that prefix for its own use (see Naming Stored Procedures),你确实会在未来某个时候冒着名称冲突的风险。 It's also bad for your stored procedure performance。最好只是简单地避免 sp_ 并使用其他东西作为前缀 - 或者根本不使用前缀!

标签: stored-procedures sql-server-2008-r2


【解决方案1】:

真正容易犯的错误。

当你声明你的存储过程时:

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

请注意,SDateNDate 在调用过程时是相反的方式。

这应该可行:

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

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

【讨论】:

  • 谢谢!你是一个救生员。
猜你喜欢
  • 1970-01-01
  • 2014-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-01
  • 1970-01-01
  • 2015-06-16
相关资源
最近更新 更多