数据流任务不产生带有声明语句的行

Zan*_*ane 7 sql-server ssis sql-server-2008-r2

我有一个 SSIS 包,它正在执行一个简单的SELECT语句,然后加载到一个表中。我已将 sql 语句匿名化,当您查看表名时,该语句应该非常明显。为了这个演示的目的,我还简化了这个包,只做一个行计数。

我遇到的这个问题是查询在 SQL 服务器中生成行,但在 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)
Run Code Online (Sandbox Code Playgroud)

请忽略 * 因为这只是为了这个演示的目的。实际查询即使没有 *. 在 SQL Server 中执行时,这会按预期从日历表中返回 1 行。但是,当在 SSIS 中针对相同的环境执行时,我没有返回任何行。

安全信息系统

如果我将查询转换为存储过程并在 SSIS 中执行 sproc,我得到的行数为 1。

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)
Run Code Online (Sandbox Code Playgroud)

然后我再次收到 1 行。

1 多行

我看到这种行为有什么原因吗?

更新:在我为此受到大量抨击之前,我对 NOLOCK 的废话别无选择。

Lam*_*mak 10

好吧,尽管我实际上并不知道这种行为背后的原因,但我记得前段时间读到过这个,以及如何解决它。要完成这项工作,您只需要SET NOCOUNT ON在 sql 命令的第一行添加:

SET NOCOUNT ON
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)
Run Code Online (Sandbox Code Playgroud)