从游标获取行时从varchar隐式转换为varbinary错误

时间:2019-05-31 13:53:29

标签: sql-server

我有一个相当长的sql脚本。基本上,它将读取一些值,并将它们插入其他一些表中:

USE [database]
GO

/****** Migração Dos Chamados De Pós-Pago ******/
DECLARE db_chamados CURSOR FOR SELECT [Id]      
      ,[NomeCliente]
      ,[CPFCliente]
      ,[Assunto]
      ,[LinhaQuestionada]
      ,[Descricao]
      ,[NumeroChamado]
      ,[DataCadastro]
      ,[IdSolicitante]
      ,[IdChamado]
      ,[DataFechado]
      ,[IdResponsavel]
      ,[UF]
      ,[CARGO]
      ,[TELEFONE]
      ,[LINHAASERPORTADA]
      ,[LINHAPROVISORIA]
      ,[TIPOLINHA]
        FROM [dbo].[POSPAGO_DEMANDA] WHERE [IdSolicitante] NOT IN (878, 1210, 1211, 1213, 1214); 

DECLARE @idDemanda int;
DECLARE @nomeCliente VARCHAR(max);
DECLARE @cpfCliente VARCHAR(MAX);
DECLARE @assunto VARCHAR(MAX);
DECLARE @linhaQuestionada VARCHAR(MAX);
DECLARE @descricao VARCHAR(MAX);
DECLARE @numeroChamado VARCHAR(MAX);
DECLARE @dataCadastro datetime;
DECLARE @idSolicitante int;
DECLARE @idChamado int;
DECLARE @dataFechado datetime;
DECLARE @idResponsavel int;
DECLARE @uf VARCHAR(2);
DECLARE @cargo VARCHAR(max);
DECLARE @telefone VARCHAR(MAX);
DECLARE @linhaASerPortada VARCHAR(max);
DECLARE @linhaProvisoria VARCHAR(max);
DECLARE @tipoLinha VARCHAR(MAX);

OPEN db_chamados;

FETCH NEXT FROM db_chamados INTO 
    @idDemanda, @nomeCliente, @cpfCliente, @assunto, @linhaQuestionada, @descricao, @numeroChamado,
    @dataCadastro, @idSolicitante, @idChamado, @dataFechado, @idResponsavel,
    @uf, @cargo, @telefone, @linhaASerPortada, @linhaProvisoria, @tipoLinha;

WHILE @@FETCH_STATUS = 0  
BEGIN  
    --Recuperando a fila
    DECLARE @id_fila int;
    SELECT @id_fila = ID FROM [Vivo_MAIS].[dbo].[CONTROLE_DE_DEMANDAS_FILA] WHERE FILA = 'Pós Pago' AND REGIONAL = 'NE';
    --Recuperando o solicitante
    DECLARE @solicitante varchar(max);
    SELECT @solicitante = LOGIN FROM [Vivo_MAIS].[dbo].ACESSO WHERE idAcesso = @idSolicitante;
    --Inserindo em [CONTROLE_DE_DEMANDAS_CHAMADO]
    DECLARE @id_chamado int;
    DECLARE @table_chamado table (id int);
    INSERT INTO [CONTROLE_DE_DEMANDAS_CHAMADO] ([ID_FILA_CHAMADO], [MATRICULA_SOLICITANTE], REGIONAL, DATA_ABERTURA)
    OUTPUT INSERTED.ID INTO @table_chamado VALUES (@id_fila, @solicitante, 'NE', @dataCadastro);
    SELECT @id_chamado = id FROM @table_chamado;
    --Inserindo em CONTROLE_DE_DEMANDAS_CAMPOS_CHAMADO
    DECLARE @id_campo_chamado int;
    DECLARE @table_campos_chamado table (id int);
    INSERT INTO [CONTROLE_DE_DEMANDAS_CAMPOS_CHAMADO] OUTPUT INSERTED.ID INTO @table_campos_chamado VALUES (@id_chamado)
    SELECT @id_campo_chamado = id FROM @table_campos_chamado;

    --Inserindo em [CONTROLE_DE_DEMANDAS_RELACAO_CAMPOS_CHAMADO]
    INSERT INTO [Vivo_MAIS].[dbo].[CONTROLE_DE_DEMANDAS_RELACAO_CAMPOS_CHAMADO] 
    VALUES (@id_campo_chamado, 'Nome Do Cliente', @nomeCliente);
    INSERT INTO [Vivo_MAIS].[dbo].[CONTROLE_DE_DEMANDAS_RELACAO_CAMPOS_CHAMADO] 
    VALUES (@id_campo_chamado, 'CPF Do Cliente', @cpfCliente);
    INSERT INTO [Vivo_MAIS].[dbo].[CONTROLE_DE_DEMANDAS_RELACAO_CAMPOS_CHAMADO] 
    VALUES (@id_campo_chamado, 'Assunto', @assunto);
    INSERT INTO [Vivo_MAIS].[dbo].[CONTROLE_DE_DEMANDAS_RELACAO_CAMPOS_CHAMADO] 
    VALUES (@id_campo_chamado, 'Linha Do Cliente', @linhaQuestionada);
    INSERT INTO [Vivo_MAIS].[dbo].[CONTROLE_DE_DEMANDAS_RELACAO_CAMPOS_CHAMADO] 
    VALUES (@id_campo_chamado, 'Problema', @descricao);
    INSERT INTO [Vivo_MAIS].[dbo].[CONTROLE_DE_DEMANDAS_RELACAO_CAMPOS_CHAMADO] 
    VALUES (@id_campo_chamado, 'Chamado/Protocolo', @numeroChamado);
    INSERT INTO [Vivo_MAIS].[dbo].[CONTROLE_DE_DEMANDAS_RELACAO_CAMPOS_CHAMADO] 
    VALUES (@id_campo_chamado, 'UF Do Solicitante', @uf);
    INSERT INTO [Vivo_MAIS].[dbo].[CONTROLE_DE_DEMANDAS_RELACAO_CAMPOS_CHAMADO] 
    VALUES (@id_campo_chamado, 'Cargo Do Solicitante', @cargo);
    INSERT INTO [Vivo_MAIS].[dbo].[CONTROLE_DE_DEMANDAS_RELACAO_CAMPOS_CHAMADO] 
    VALUES (@id_campo_chamado, 'Telefone Do Solicitante', @telefone);
    INSERT INTO [Vivo_MAIS].[dbo].[CONTROLE_DE_DEMANDAS_RELACAO_CAMPOS_CHAMADO] 
    VALUES (@id_campo_chamado, 'Linha A Ser Portada', @linhaASerPortada);
    INSERT INTO [Vivo_MAIS].[dbo].[CONTROLE_DE_DEMANDAS_RELACAO_CAMPOS_CHAMADO] 
    VALUES (@id_campo_chamado, 'Linha Provisória', @linhaProvisoria);
    INSERT INTO [Vivo_MAIS].[dbo].[CONTROLE_DE_DEMANDAS_RELACAO_CAMPOS_CHAMADO] 
    VALUES (@id_campo_chamado, 'Tipo Da Linha', @tipoLinha);

    --Inserindo em [CONTROLE_DE_DEMANDAS_STATUS_CHAMADO]
    DECLARE @id_status_chamado int
    DECLARE @table_status_chamado table (id int)
    INSERT INTO [CONTROLE_DE_DEMANDAS_STATUS_CHAMADO] OUTPUT INSERTED.ID INTO @table_status_chamado VALUES (@id_chamado)
    SELECT @id_status_chamado = id FROM @table_status_chamado;

    --Declarando cursor para pegar o histórico de respostas/status do chamado:
    DECLARE db_historico CURSOR FOR SELECT 
                ID,
                [RESPOSTA],
                [ID_DEMANDA],
                [ID_RESPONSAVEL],
                [DATA_RESPOSTA],
                [Status] 
                FROM [dbo].[POSPAGO_RESPOSTA] WHERE [ID_DEMANDA] = @idDemanda;

    DECLARE @idResposta int;
    DECLARE @resposta varchar(max);
    DECLARE @id_demanda int;
    DECLARE @idResponsavelResposta int;
    DECLARE @dataResposta datetime;
    DECLARE @status varchar(255);

    --Inserindo em CONTROLE_DE_DEMANDAS_RELACAO_STATUS_CHAMADO e em CONTROLE_DE_DEMANDAS_CHAMADO_RESPOSTA
    OPEN db_historico;
    FETCH NEXT FROM db_historico INTO @idResposta, @resposta, @id_demanda, @idResponsavelResposta, @dataResposta, @status;
    WHILE @@FETCH_STATUS = 0  
    BEGIN
        --Recuperando o responsável pela resposta
        DECLARE @responsavel varchar(max);
        SELECT @responsavel = LOGIN FROM [Vivo_MAIS].[dbo].[ACESSO] WHERE idAcesso = @idResponsavelResposta;
        --Inserindo em CONTROLE_DE_DEMANDAS_RELACAO_STATUS_CHAMADO
        INSERT INTO [CONTROLE_DE_DEMANDAS_RELACAO_STATUS_CHAMADO] VALUES (@id_status_chamado, @status, GETDATE(), null);
        --Inserindo em CONTROLE_DE_DEMANDAS_CHAMADO_RESPOSTA
        DECLARE @id_resposta_chamado int
        DECLARE @table_resposta_chamado table (id int)
        INSERT INTO [CONTROLE_DE_DEMANDAS_CHAMADO_RESPOSTA] OUTPUT INSERTED.ID INTO @table_resposta_chamado VALUES (@resposta, @id_chamado, @responsavel, @dataResposta);
        SELECT @id_resposta_chamado = id FROM @table_resposta_chamado;
        --Recuperando e inserindo os arquivos da resposta
        DECLARE db_arquivos_respostas CURSOR FOR SELECT [NOME_CAMPO], [ARQUIVO], [EXT_ARQUIVO] FROM [POSPAGO_ARQUIVOS_RESPOSTA] WHERE [ID_RESPOSTA] = @idResposta;

        DECLARE @nomeArquivoResposta VARCHAR(MAX);
        DECLARE @arquivoResposta VARBINARY(MAX);
        DECLARE @extArquivoResposta VARCHAR(10);

        OPEN db_arquivos_respostas;
        FETCH NEXT FROM db_arquivos_respostas INTO @nomeArquivoResposta, @arquivoResposta, @extArquivoResposta;
        WHILE @@FETCH_STATUS = 0  
        BEGIN
            INSERT INTO CONTROLE_DE_DEMANDAS_ARQUIVOS_RESPOSTA VALUES (@id_resposta_chamado, @nomeArquivoResposta, @arquivoResposta, @extArquivoResposta);
            FETCH NEXT FROM db_arquivos_respostas INTO @nomeArquivoResposta, @arquivoResposta, @extArquivoResposta;
        END;        
        CLOSE db_arquivos_respostas;
        DEALLOCATE db_arquivos_respostas;
        FETCH NEXT FROM db_historico INTO @idResposta, @resposta, @id_demanda, @idResponsavelResposta, @dataResposta, @status;
    END;
    CLOSE db_historico;
    DEALLOCATE db_historico;
    --Inserindo em CONTROLE_DE_DEMANDAS_CHAMADO_ARQUIVOS    
    DECLARE db_arquivos_chamado CURSOR FOR SELECT [NOME_CAMPO], [ARQUIVO], [EXT_ARQUIVO] FROM [POSPAGO_ARQUIVOS] WHERE [ID_DEMANDA] = @idDemanda;

    DECLARE @nomeArquivoChamado VARCHAR(MAX);
    DECLARE @arquivoChamado VARBINARY(MAX);
    DECLARE @extArquivoChamado VARCHAR(10);

    OPEN db_arquivos_chamado;
    FETCH NEXT FROM db_arquivos_chamado INTO @nomeArquivoChamado, @arquivoChamado, @extArquivoChamado;
    WHILE @@FETCH_STATUS = 0  --HERE'S THE PROBLEM
    BEGIN
        INSERT INTO CONTROLE_DE_DEMANDAS_CHAMADO_ARQUIVOS VALUES (@id_chamado, @nomeArquivoChamado, @arquivoChamado, @extArquivoChamado);
        FETCH NEXT FROM db_arquivos_chamado INTO @nomeArquivoChamado, @arquivoChamado, @extArquivoChamado;
    END;
    CLOSE db_arquivos_chamado;
    DEALLOCATE db_arquivos_chamado;
    FETCH NEXT FROM db_chamados INTO 
    @idDemanda, @nomeCliente, @cpfCliente, @assunto, @linhaQuestionada, @descricao, @numeroChamado,
    @dataCadastro, @idSolicitante, @idChamado, @dataFechado, @idResponsavel,
    @uf, @cargo, @telefone, @linhaASerPortada, @linhaProvisoria, @tipoLinha;
END;
CLOSE db_chamados;
DEALLOCATE db_chamados;

当我执行它时,它在“ HERE'S PROBLEM”行中为我提供了从一种类型到另一种不允许的错误的隐式转换。我在声明游标时尝试进行显式转换,但仍然无法正常工作。我再次检查了列,并且它们的类型与声明的变量匹配。我在这里想念什么?

0 个答案:

没有答案