Eu tenho um pacote SSIS que está fazendo uma SELECT
declaração simples e, em seguida, carregando em uma tabela. Eu anonimizei a instrução sql, que deve ser dolorosamente óbvia quando você olha para o nome da tabela. Eu também simplifiquei o pacote para fazer apenas uma contagem de linhas para esta demonstração.
O problema que estou tendo é que a consulta produz linhas no servidor SQL, mas não produz linhas no SSIS. A consulta é a seguinte.
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)
Ignore o *, pois é apenas para fins desta demonstração. A consulta real tem o mesmo problema, embora não tenha o *. Quando executado no servidor SQL, retorna 1 linha da tabela de calendário conforme o esperado. No entanto, quando executado no mesmo ambiente no SSIS, não recebo nenhuma linha retornada.
Se eu transformar a consulta em um procedimento armazenado e executar o sproc no SSIS, obtenho uma contagem de linha de 1.
Se eu alterar a consulta para this.
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)
Então eu mais uma vez recebo 1 linha.
Existe alguma razão para eu estar vendo esse comportamento?
ATUALIZAÇÃO: Antes de receber uma tonelada de críticas por isso, não tenho escolha sobre o absurdo do NOLOCK.
Bem, embora eu realmente não saiba o motivo por trás desse comportamento, lembro-me de ter lido sobre isso há algum tempo e o que fazer para corrigi-lo. Para fazer isso funcionar, você só precisa adicionar
SET NOCOUNT ON
como primeira linha do seu comando sql:Lamak respondeu à pergunta.
O motivo pode ser que, durante o tempo de execução do pacote, o OLEDB processará o primeiro conjunto de resultados. Portanto, quando o comando contém uma variável, as
DONE_IN_PROC
mensagens serão retornadas como conjuntos de resultados vazios. Portanto, a fonte OLEDB pegará o primeiro conjunto de resultados e prosseguirá, o que levará o pacote a ser bem-sucedido, mas sem nenhuma linha.Como Lamak apontou, o
SET NOCOUNT ON
irá suprimir o envio das mensagens DONE_IN_PROC para o cliente.