存储过程如何在从 BIDS 调用时不返回行,但在使用相同参数时从 SSMS 调用时返回行?

Posted

技术标签:

【中文标题】存储过程如何在从 BIDS 调用时不返回行,但在使用相同参数时从 SSMS 调用时返回行?【英文标题】:How can stored procedure return no rows when called from BIDS but return rows when called from SSMS when using the same parameter? 【发布时间】:2011-09-13 18:32:27 【问题描述】:

使用 s-s-rS 2008R2 和 SQL Server 2005 数据库作为数据源。

我在 Business Intelligence Development Studio (VS 2008) 中构建了一份报告(.rdl 文件)。它使用存储过程作为数据源。 proc 采用一个参数,一个 INT,它是 proc 中的一个 SELECT 中主表的唯一键。

对于某些参数值,从 BIDS 的查询设计器中执行 proc 不会返回任何行。使用 same 参数值 从 SSMS 执行 same procedure 会返回行。无论调用是来自 BIDS 还是 SSMS,Profiler 都会显示相同的 SELECT。他们怎么会得到不同的结果?

这里是过程:

CREATE PROCEDURE [Report_BatchEdit]
    @BatchAltId INT
AS
   SELECT   b.[BatchAltId]
            , fs.[Name] AS [FundingSource]
            , b.[StartDate] AS [StartDate]
            , b.[StopDate] AS [StopDate]
            , b.[Description]
            , b.[Created]
            , bl.[BillId]
            , COALESCE(c.[Name], bill.RecipientCustomerName) AS [CustomerName]
            , COALESCE(ri.[Identifier], bill.[RecipientIdentifier]) AS [MedicaidNumber]
            , bill.[NetTotal] AS [ClaimAmount]
            , bl.[BillingCodeCode] AS [BillingCode]
            , bl.[BillingCodeDescription] AS [BillingCodeDescription]
            , bl.[StartDate] AS [FromDate]
            , bl.[StopDate] AS [ToDate]
            , bl.[UnitSizeName] AS [UnitSize]
            , bl.[CalculatedUnits] AS [Units]
            , bl.[Rate]
            , bl.[Amount]
            , fs.UsesModifiers
            , CASE WHEN fs.UsesModifiers = 1 THEN rm1.[Code] ELSE NULL END AS [RateModifier1Code]
            , CASE WHEN fs.UsesModifiers = 1 THEN rm2.[Code] ELSE NULL END AS [RateModifier2Code]
            , CASE WHEN fs.UsesModifiers = 1 THEN rm3.[Code] ELSE NULL END AS [RateModifier3Code]
            , CASE WHEN fs.UsesModifiers = 1 THEN rm4.[Code] ELSE NULL END AS [RateModifier4Code]
    FROM    [Batch] AS b 
            JOIN [Bill] AS bill ON b.[BatchId] = bill.[BatchId] 
            JOIN [BillLine] AS bl ON bill.[BillId] = bl.[BillId]
            JOIN [Customer] AS fs ON b.[PayerCustomerId] = fs.[CustomerId]
            LEFT JOIN [Customer] AS c ON bill.[RecipientCustomerId] = c.[CustomerId]
            LEFT JOIN [RecipientIdentifier] AS ri ON b.[PayerCustomerId] = ri.[PayerCustomerId] AND bill.[RecipientCustomerId] = ri.[RecipientCustomerId]
            LEFT JOIN [RateModifier] AS rm1 ON bl.[RateModifier1Id] = rm1.[RateModifierId]
            LEFT JOIN [RateModifier] AS rm2 ON bl.[RateModifier2Id] = rm1.[RateModifierId]
            LEFT JOIN [RateModifier] AS rm3 ON bl.[RateModifier3Id] = rm1.[RateModifierId]
            LEFT JOIN [RateModifier] AS rm4 ON bl.[RateModifier4Id] = rm1.[RateModifierId]
   WHERE    BatchAltId = @BatchAltId 
ORDER BY    [FundingSource], b.[StartDate], b.[Description], [CustomerName], [BillingCode], [FromDate], [ToDate]

【问题讨论】:

我能看到它发生的唯一方法是 .rdl 使用的数据源是否引用了与在 SSMS 中运行查询时不同的数据库。您是否尝试过删除数据源并读取它? 你能举一个返回正确结果的参数值和不返回正确结果的参数值的例子吗?除了您在 Twitter 上提到的 StmtCompleted 事件之外,您还可以尝试捕获 RPC 和 SP:Starting 事件吗?这将确保您可以看到 s-s-rS 正在进行的过程调用(与仅 proc 内的语句相比)。 【参考方案1】:

这听起来很傻,但是您确定 BIDS 包引用的数据库与运行 SSMS 查询的服务器位于同一台服务器上吗?当我遇到这样的事情时,我几乎总是在包的配置中发现一个错误,并且数据源指向错误的服务器。

【讨论】:

这是在我们的开发环境中。我们在一个实例中拥有我们软件的各种版本的数据库。报表服务器尚未更新以使数据源指向新版本数据库(也没有 BIDS),因此指向旧记录的报表工作正常,但使用较新记录的参数值未发现任何行。

以上是关于存储过程如何在从 BIDS 调用时不返回行,但在使用相同参数时从 SSMS 调用时返回行?的主要内容,如果未能解决你的问题,请参考以下文章

调用SQL存储过程的C#函数在从本地计算机使用时有效,但在从云中的Azure函数调用时失败

MS Management Studio 中的存储过程返回数据。使用 C# 调用时不返回任何数据

从后台返回时隐藏音量 HUD

Flutter 错误 - 断言失败:第 213 行 pos 15:'data != null':在从 firestore 获取数据时不正确

如何调用返回 1 行的存储过程?

MYSQL的存储过程如何返回查询到的行数据?