Usuário com melhor resposta
Error converting data type varchar to datetime.

Pergunta
-
Bom dia, tenho uma procedure que é executada pelo meu Vb.net afim de criar um relatório, porém...estou a obter o seguinte erro quando executo a procedure com seus respetivos parâmetros ERRO: "Error converting data type varchar to datetime."
Segue a Procedure:
CREATE OR ALTER PROCEDURE EsRl230
@EMPCod NVARCHAR(MAX),
@SGPId NVARCHAR(MAX),
@MAPId NVARCHAR(MAX),
@DtNaoVendido DATETIME,
@DtCadastro DATETIME
AS
DECLARE
@sql NVARCHAR(MAX)
SET @DtNaoVendido = CONVERT(VARCHAR(23), @DtNaoVendido, 101)
SET @DtCadastro = CONVERT(VARCHAR(23), @DtCadastro, 101)
SET @sql =
'SELECT ' +
'EMPSigla, ' +
'GRPCod, ' +
'GRPDesc, ' +
'SGPCod, ' +
'SGPDesc, ' +
'MAPDesc, ' +
'PROCod, ' +
'PROCodFab, ' +
'PRODesc = SUBSTRING(PRODesc,1,50), ' +
'PROAplic = SUBSTRING(PROAplic,1,100), ' +
'PREQtEst, ' +
'PREPrVd, ' +
'PRECstRp, ' +
'COSDtFec, ' +
'CNEDtLib ' +
'FROM ' +
'EsPRE (NoLock) ' +
'JOIN GnEMP (NoLock) ON EsPRE.EMPCod = GnEMP.EMPCod ' +
'JOIN EsINE (NoLock) ON EsPRE.PREid = EsINE.PREid ' +
'JOIN EsCNE (NoLock) ON EsINE.CNEId = EsCNE.CNEId ' +
'JOIN EsPRO (NoLock) ON EsPRE.PROId = EsPRO.PROId ' +
'JOIN EsSGP (NoLock) ON EsPRO.SGPId = EsSGP.SGPId ' +
'JOIN EsGRP (NoLock) ON EsSGP.GRPId = EsGRP.GRPId ' +
'LEFT JOIN EsMAP (NoLock) ON EsPRO.MAPId = EsMAP.MAPId ' +
'JOIN SeCOS (NoLock) ON SeCOS.EMPCod = GnEMP.EMPCod ' +
'JOIN SeCRQ (NoLock) ON SeCOS.COSid = SeCRQ.COSid ' +
'WHERE ' +
'EsPRE.EMPCod IN (' + @EMPCod + ') '
IF @SGPId IS NOT NULL
BEGIN
SET @sql = @sql + 'AND SGPId IN ' + @SGPId
END
IF @MAPId IS NOT NULL
BEGIN
SET @sql = @sql + 'AND MAPId IN (' + @MAPId + ') '
END
IF @DtNaoVendido IS NOT NULL
BEGIN
SET @sql = @sql + 'AND COSDtFec >= ' + @DtNaoVendido
END
IF @DtCadastro IS NOT NULL
BEGIN
SET @sql = @sql + ' AND CNEDtLib <= ' + @DtCadastro
END
EXEC (@sql )
GOQuando executo passo os seguintes parâmetros por exemplo :
execute EsRl230 '297', NULL, NULL, '02/04/2018' , '23/04/2018'
por favor alguém me pode ajudar para ver onde estou errando para esse erro surgir?
Respostas
Todas as Respostas
-
-
Nelson,
Como está fazendo a chamada da proc via código? Posso dar uma olhada no trecho?
[]'s
Get
Dim ds As New EsRl230_Ds
Dim strSql As String =
"EsRl230 " &
SqlString(EMPCod, True) &
SqlString(SGPId, True) &
SqlString(MAPId, True) & "'" &
Convert.ToDateTime(DtBoxProVenda) & "'" & "," & "'" &
Convert.ToDateTime(DtBoxProCadastro) & "'"
FillDataSetTable(strSql, ds, "Dados")
Return ds
End Get
End Property
End Class -
Nelson,
Como está fazendo a chamada da proc via código? Posso dar uma olhada no trecho?
[]'s
Public ReadOnly Property Dados As EsRl230_Ds
Get
Dim ds As New EsRl230_Ds
Dim strSql As String =
"EsRl230 " &
SqlString(EMPCod, True) &
SqlString(SGPId, True) &
SqlString(MAPId, True) & "'" &
Convert.ToDateTime(DtBoxProVenda) & "'" & "," & "'" &
Convert.ToDateTime(DtBoxProCadastro) & "'"
FillDataSetTable(strSql, ds, "Dados")
Return ds
End Get
End Property
End Class
Você já tentou atribuir essa mesma parametrização a uma chamada direta pelo seu banco? (com a data dd/MM/yyyy)
Uma opção seria o cast da DtBoxProVenda e DtBoxProCadastro com hh:mm:ss, no formato padrão do SQL. Pelo meu entendimento, na sua conversão você está colocando a data entre aspas, então é um varchar... Tente algo como: Convert.ToDateTime(DtBoxProVenda).ToString("MM/dd/yyyy HH:mm:ss") (veja o formato correto que você precisa)
Outra alternativa: Altere o parâmetro de DtNaoVendido e DtCadastro para receber varchar, e faça o cast dentro da proc...
[]'s
- Editado adeilsoncs terça-feira, 24 de abril de 2018 13:49
-
Nelson,
Como está fazendo a chamada da proc via código? Posso dar uma olhada no trecho?
[]'s
Public ReadOnly Property Dados As EsRl230_Ds
Get
Dim ds As New EsRl230_Ds
Dim strSql As String =
"EsRl230 " &
SqlString(EMPCod, True) &
SqlString(SGPId, True) &
SqlString(MAPId, True) & "'" &
Convert.ToDateTime(DtBoxProVenda) & "'" & "," & "'" &
Convert.ToDateTime(DtBoxProCadastro) & "'"
FillDataSetTable(strSql, ds, "Dados")
Return ds
End Get
End Property
End Class
Você já tentou atribuir essa mesma parametrização a uma chamada direta pelo seu banco? (com a data dd/MM/yyyy)
Uma opção seria o cast da DtBoxProVenda e DtBoxProCadastro com hh:mm:ss, no formato padrão do SQL. Pelo meu entendimento, na sua conversão você está colocando a data entre aspas, então é um varchar... Tente algo como: Convert.ToDateTime(DtBoxProVenda).ToString("MM/dd/yyyy HH:mm:ss") (veja o formato correto que você precisa)
Outra alternativa: Altere o parâmetro de DtNaoVendido e DtCadastro para receber varchar, e faça o cast dentro da proc...
[]'s
-
Ola,
tente executar a procedure assim:
execute EsRl230 '297', NULL, NULL, '2018-04-02' , '2018-04-23'
Abs
Vinicius Fonseca - MCP | MCTS | MCDBA | MCITP | MCTS | MCT | ITIL Foundation - DGA SISTEMAS - Se minha resposta for útil, classifique-a. :)
-
Estou revendo sua procedure aqui, e dentro dela você já faz um CONVERT da data para o formato VARCHAR,
Trecho:
SET @DtNaoVendido = CONVERT(VARCHAR(23), @DtNaoVendido, 101) SET @DtCadastro = CONVERT(VARCHAR(23), @DtCadastro, 101)
Neste caso, tente alterar o formato de entrada da procedure para:
@DtNaoVendido NVARCHAR(MAX), @DtCadastro NVARCHAR(MAX)
Assim você pode fazer a conversão no formato 101 (mm/dd/yyyy) direto no seu código, e eliminaria a conversão dentro da proc.
-
-
Estou revendo sua procedure aqui, e dentro dela você já faz um CONVERT da data para o formato VARCHAR,
Trecho:
SET @DtNaoVendido = CONVERT(VARCHAR(23), @DtNaoVendido, 101) SET @DtCadastro = CONVERT(VARCHAR(23), @DtCadastro, 101)
Neste caso, tente alterar o formato de entrada da procedure para:
@DtNaoVendido NVARCHAR(MAX), @DtCadastro NVARCHAR(MAX)
Assim você pode fazer a conversão no formato 101 (mm/dd/yyyy) direto no seu código, e eliminaria a conversão dentro da proc.
O erro que surge agora é
Msg 102, Level 15, State 1, Line 84
Incorrect syntax near '00'.A String está saindo AND COSDtFec >= 2018-04-02 00:00:00.00 AND CNEDtLib <= 2018-04-24 23:59:59.00
esse .00 sabe como tirar?
-
-
Uma das causas do erro "Error converting data type varchar to datetime." é informar a data em um formato mas a sessão estar configurada para tratar as conversões implícitas em outro formato. Por exemplo, receber a data no formato dd/mm/aaaa mas a sessão está configurada para conversões implícitas utilizando o formato mm/dd/aaaa. Neste caso, para o valor '23/04/2018' ocorre erro, pois não existe mês 23.
Outra possibilidade é no caso de conversão explícita mas com o estilo definido diferente do valor recebido. Por exemplo,
convert(date, '23/04/2018', 101)
Neste caso, o estilo definido, 101, requer que a data seja informada no formato mm/dd/aaaa...Para mim o trecho
SET @DtNaoVendido = CONVERT(VARCHAR(23), @DtNaoVendido, 101)
SET @DtCadastro = CONVERT(VARCHAR(23), @DtCadastro, 101)
não faz sentido e é provável que o erro esteja nessas instruções. Observe que como as duas variáveis (na realidade são parâmetros de entrada!) estão declaradas como datetime, ocorre uma conversão implícita de varchar(23) para datetime antes do armazenamento. O estilo 101 faz com que seja gerado string no formato mm/dd/aaaa; após, a conversão implícita transforma o string em tipo de dados datetime utilizando o dateformat corrente.
(1)
Qual é o número da linha indicada como local do erro? Se for 1, provavelmente é algo na passagem ou declaração dos parâmetros.(2)
Para fins de testes, no lugar de
EXEC (@sql )
coloque
PRINT @sqle analise o texto gerado para o comando T-SQL.
(3)
Sugiro que substitua o trecho
IF @SGPId IS NOT NULL
BEGIN
SET @sql = @sql + 'AND SGPId IN ' + @SGPId
END
por
IF @SGPId IS NOT NULL
BEGIN
SET @sql = @sql + 'AND SGPId IN (' + @SGPId + ') '
END(4)
Como estão declaradas as colunas COSDtFec e CNEDtLib?-----
Enquanto as respostas não vêm, eis sugestão de modificação no código:
-- código #1 ... declare @sql nvarchar(max); declare @xDtNaoVendido char(10), @xDtCadastro char(10); set @xDtNaoVendido= convert(char(10), @DtNaoVendido, 103); set @xDtCadastro= convert(char(10), @DtCadastro, 103); ...
e
-- código #2 ... IF @xDtNaoVendido IS NOT NULL set @sql = @sql + 'AND COSDtFec >= convert(date, ''' + @xDtNaoVendido + ''', 103) '; IF @xDtCadastro IS NOT NULL SET @sql = @sql + 'AND CNEDtLib <= convert(date, ''' + @xDtCadastro + ''', 103) '; ...
José Diz Belo Horizonte, MG - Brasil
-