我有一个 SSIS 包,它正在执行一个简单的SELECT
语句,然后加载到一个表中。我已经匿名化了 sql 语句,当您查看表名时,这应该是显而易见的。为了这个演示的目的,我还简化了包以只计算行数。
我遇到的这个问题是查询在 SQL Server 中生成行但在 SSIS 中不生成任何行。查询如下。
DECLARE @CurrentBlahDate DATETIME
SET @CurrentBlahDate = ( SELECT MAX(BlahDate)
FROM dbo.ThisCoolTable SL
WITH ( NOLOCK )
INNER JOIN dbo.ThatCoolTable SLF
WITH ( NOLOCK ) ON SL.CoolID = SLF.CoolID
AND SLF.TypeCode IN (
'ValueA',
'ValueB' ))
SELECT
*
FROM dbo.Calendar
WHERE CAST(BaseDate AS DATE) = CAST(@CurrentBlahDate AS DATE)
请忽略 *,因为它仅用于演示目的。实际查询有同样的问题,即使它没有 *。在 SQL Server 中执行时,这会按预期从日历表中返回 1 行。但是,当在 SSIS 中针对相同环境执行时,我没有返回任何行。
如果我将查询转换为存储过程并在 SSIS 中执行存储过程,我得到的行数为 1。
如果我将查询更改为此。
SELECT
*
FROM dbo.Calendar
WHERE CAST(BaseDate AS DATE) = CAST(( SELECT MAX(BlahDate)
FROM dbo.ThisCoolTable SL
WITH ( NOLOCK )
INNER JOIN dbo.ThatCoolTable SLF
WITH ( NOLOCK ) ON SL.CoolID = SLF.CoolID
AND SLF.TypeCode IN (
'ValueA',
'ValueB' )) AS DATE)
然后我再次收到 1 行。
有什么理由让我看到这种行为吗?
更新:在我收到大量批评之前,我对 NOLOCK 废话别无选择。
好吧,尽管我实际上并不知道这种行为背后的原因,但我记得前一段时间读过这篇文章,以及如何解决它。为了使这个工作,你只需要添加
SET NOCOUNT ON
作为你的 sql 命令的第一行:拉马克回答了这个问题。
原因可能是在程序包运行时,OLEDB 将处理第一个结果集。因此,当命令包含变量时,
DONE_IN_PROC
消息将作为空结果集返回。因此 OLEDB 源将采用第一个结果集并将继续进行,这将导致包成功但没有任何行。正如 Lamak 指出的那样,
SET NOCOUNT ON
将禁止向客户端发送DONE_IN_PROC消息。