none
Erro "Error converting data type varchar to int" ao executar procedure com sp_executesql RRS feed

  • Pergunta

  • Pessoal, estou com uma procedure que ao ser executada via EXEC apenas, ela funciona normalmente, porém como estou executando via aplicação .Net, o comando é transformado no seguinte:

    exec sp_executesql N'EXEC [dbo].[FindCompaniesNearby] @latitude,@longitude,@radius,@amenities',N'@latitude float,@longitude float,@radius float,@amenities varchar(1)',@latitude=-25.5130415,@longitude=-49.3007317,@radius=10000,@amenities='A'

    Mas isto está gerando o erro: "Error converting data type varchar to int". Sendo que com o simples EXEC abaixo funciona.

    EXEC[dbo].[FindCompaniesNearby]
    		@latitude = -25.5130415,
    		@longitude = -49.3007317,
    		@amenities = N'A'

    Já simplifiquei a procedure (simplesmente removi toda query e coloquei alguma coisa qualquer):

    CREATE  PROCEDURE [dbo].[FindCompaniesNearby]
    (
    	@latitude float,
    	@longitude float,
    	@radius int = 1000,
    	@minRating int = NULL,
    	@maxDistance int = NULL, 
    	@justFriends bit = 0,
    	@justUserBrand bit = 0,
    	@amenities varchar(400) = NULL
    )
    AS
    
    	SELECT * FROM dbo.Companies

    Estou rodando no SQL Server 2016 Developer Edition, via SSMS.

    UPDATE

    Se eu altero a ordem dos parâmetros, funciona. Alguma explicação?

    (
    	@latitude float,
    	@longitude float,
    	@radius float = 1000,
    	@amenities varchar(400), -- Neste caso funcionou
    	@minRating int = NULL,
    	@maxDistance int = NULL, 
    	@justFriends bit = 0,
    	@justUserBrand bit = 0
    )


    Juliano Nunes - http://linkedin.com/in/julianonunes

    Lembre-se de clicar em "Votar como útil" e "Marcar como Resposta" caso tenha respondido sua dúvida.

    Remember to "Vote as Helpful" and "Mark as Answer" if your question has been answered.


    quarta-feira, 17 de maio de 2017 13:05

Respostas

  • Bom dia, Juliano!

    O segundo parâmetro da procedure sp_executesql é a declaração de outras variáveis. Dessa forma, você está declarando variáveis e passando as mesmas como paramento para a procedure FindCompaniesNearby.

    Como as variáveis declaradas possuem o mesmo nome das variáveis da procedure FindCompaniesNearby confunde um pouco, mas é como se você estivesse fazendo isso:

    Declare @OutroNome_latitude	 float,
    		@OutroNome_longitude float,
    		@OutroNome_radius	int = 1000,
    		@OutroNome_amenities varchar(400) = NULL
    
    EXEC [dbo].[FindCompaniesNearby] @OutroNome_latitude,@OutroNome_longitude,@OutroNome_radius,@OutroNome_amenities

    ao invés disso:

    Declare @OutroNome_latitude	 float,
    		@OutroNome_longitude float,
    		@OutroNome_radius	int = 1000,
    		@OutroNome_amenities varchar(400) = NULL
    
    EXEC [dbo].[FindCompaniesNearby] @latitude = @OutroNome_latitude,@longitude = @OutroNome_longitude, @radius = @OutroNome_radius, @amenities = @OutroNome_amenities

    Ou seja, a procedure deve ser executada dessa forma:

    exec sp_executesql N'EXEC [dbo].[FindCompaniesNearby] @latitude = @latitude,@longitude = @longitude,@radius = @radius,@amenities = @amenities'
    ,                  N'@latitude float,@longitude float,@radius float,@amenities varchar(1)'
    ,                  @latitude =-25.5130415
    ,                  @longitude=-49.3007317
    ,                  @radius   =10000
    ,                  @amenities='A'




    quarta-feira, 17 de maio de 2017 14:22

Todas as Respostas

  • Bom dia, Juliano!

    O segundo parâmetro da procedure sp_executesql é a declaração de outras variáveis. Dessa forma, você está declarando variáveis e passando as mesmas como paramento para a procedure FindCompaniesNearby.

    Como as variáveis declaradas possuem o mesmo nome das variáveis da procedure FindCompaniesNearby confunde um pouco, mas é como se você estivesse fazendo isso:

    Declare @OutroNome_latitude	 float,
    		@OutroNome_longitude float,
    		@OutroNome_radius	int = 1000,
    		@OutroNome_amenities varchar(400) = NULL
    
    EXEC [dbo].[FindCompaniesNearby] @OutroNome_latitude,@OutroNome_longitude,@OutroNome_radius,@OutroNome_amenities

    ao invés disso:

    Declare @OutroNome_latitude	 float,
    		@OutroNome_longitude float,
    		@OutroNome_radius	int = 1000,
    		@OutroNome_amenities varchar(400) = NULL
    
    EXEC [dbo].[FindCompaniesNearby] @latitude = @OutroNome_latitude,@longitude = @OutroNome_longitude, @radius = @OutroNome_radius, @amenities = @OutroNome_amenities

    Ou seja, a procedure deve ser executada dessa forma:

    exec sp_executesql N'EXEC [dbo].[FindCompaniesNearby] @latitude = @latitude,@longitude = @longitude,@radius = @radius,@amenities = @amenities'
    ,                  N'@latitude float,@longitude float,@radius float,@amenities varchar(1)'
    ,                  @latitude =-25.5130415
    ,                  @longitude=-49.3007317
    ,                  @radius   =10000
    ,                  @amenities='A'




    quarta-feira, 17 de maio de 2017 14:22
  • Bom dia,

    Por falta de retorno esta thread esta encerrada !

    Por gentileza, caso necessário abra uma nova thread.

    Atenciosamente,


    Guilherme Macedo S

    Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    TechNet Community Support

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    segunda-feira, 22 de maio de 2017 13:02