Variáveis em Procedure - Erro conversão

SQL Server

SQL

30/07/2020

BEGIN
	SET NOCOUNT ON;

	SET LANGUAGE BRAZILIAN;

	declare
	@CODPROD			INT,
	@SKU				INT,
	@POST_ID			INT,
	@PRECOWOO			VARCHAR(10),
	@ESTOQUEWOO			VARCHAR(10),
	@PRECODESCJIVA		DECIMAL(15,2),
	@PRECOPADRAOJIVA	DECIMAL(15,2),
	@ESTOQUEJIVA		DECIMAL(15,2),
	@AUX_POST_ID		INT


	/* CURSOR PARA ATUALIZAÇÃO DE ESTOQUE E PREÇO */
	DECLARE EXPORTACAO_STATUS CURSOR FOR

****************
Mensagem 8114, Nível 16, Estado 5, Linha 72
Erro ao converter tipo de dados varchar em numeric.





Estou recebendo essa mensagem de erro ao executar a Procedure, estou utulizando o Management Studio do SQL, como eu posso saber qual variável está com o problema?
Ronaldo Pontes

Ronaldo Pontes

Curtidas 0

Melhor post

Roberto Castelani

Roberto Castelani

30/07/2020

Bom dia amigo!
Eu não utilizo o Management Studio do SQL , mais de uma olhada nessa parte do código aonde a msn de erro está apontada!

Uma vez tive um problema de conversão e foi porque meu campo data na base de dados eu coloquei ( vachar) e quando estava programando eu coloquei ele em tipo (date) verifique primeiro qual o campo está dando esse retorno na base de dados e depois de uma olhada na sua aplicação!

Mensagem 8114, Nível 16, Estado 5, Linha 72
Erro ao converter tipo de dados varchar em numeric.
[/code]



GOSTEI 1

Mais Respostas

Ronaldo Pontes

Ronaldo Pontes

30/07/2020

Bom dia amigo!
Eu não utilizo o Management Studio do SQL , mais de uma olhada nessa parte do código aonde a msn de erro está apontada!

Uma vez tive um problema de conversão e foi porque meu campo data na base de dados eu coloquei ( vachar) e quando estava programando eu coloquei ele em tipo (date) verifique primeiro qual o campo está dando esse retorno na base de dados e depois de uma olhada na sua aplicação!

Mensagem 8114, Nível 16, Estado 5, Linha 72
Erro ao converter tipo de dados varchar em numeric.
[/code]





Bom dia Roberto, obrigado.
Já tentei mudar o valor das variáveis,

Preciso ver onde eu posso testar essa Procedure, pq no Management não tem mais a opção do debug.
Também acho que o campo da tabela está trazendo valores mistos
GOSTEI 1
Emerson Nascimento

Emerson Nascimento

30/07/2020

e qual o conteúdo da linha 72 ?

provavelmente há uma concatenação, ou talvez uma operação com variáveis com conteúdo incompatível.
talvez sejam essas variáveis:
    @PRECOWOO           VARCHAR(10),
    @ESTOQUEWOO         VARCHAR(10),
que aparentemente deveriam ter conteúdo numérico (preco, estoque) e estão definidas como varchar.

difícil responder sem a procedure completa.
GOSTEI 0
Ronaldo Pontes

Ronaldo Pontes

30/07/2020

e qual o conteúdo da linha 72 ?

provavelmente há uma concatenação, ou talvez uma operação com variáveis com conteúdo incompatível.
talvez sejam essas variáveis:
    @PRECOWOO           VARCHAR(10),
    @ESTOQUEWOO         VARCHAR(10),
que aparentemente deveriam ter conteúdo numérico (preco, estoque) e estão definidas como varchar.

difícil responder sem a procedure completa.




USE [JIVA_PROD]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO


BEGIN
	SET NOCOUNT ON;

	SET LANGUAGE BRAZILIAN;

	declare
	@CODPROD			INT,
	@SKU				INT,
	@POST_ID			INT,
	@PRECOWOO			INT,
	@ESTOQUEWOO			INT,
	@PRECODESCJIVA		DECIMAL(15,2),
	@PRECOPADRAOJIVA	DECIMAL(15,2),
	@ESTOQUEJIVA		DECIMAL(15,2),
	@AUX_POST_ID		INT


	/* CURSOR PARA ATUALIZAÇÃO DE ESTOQUE E PREÇO */
	DECLARE EXPORTACAO_STATUS CURSOR FOR
	
	

	SELECT        PRO.CODPROD, WOO.id AS post_id, PRC.meta_value AS woocommercesaleprice, JIVA.FN_PRECO_VENDA_ECOMMERCE(PRO.CODPROD) AS '_price', JIVA.FN_PRECO_VENDA_ECOMMERCE_PADRAO(PRO.CODPROD) 
                         AS '_regular_price', preco.meta_value AS PRECOPADRAOWOO, ES.meta_value AS woocommercestock, CASE WHEN ISNULL(est.SALDO, 0) - ISNULL(pro.AD_ESTMINLV, 0.00) <= 0 THEN 0 ELSE ISNULL(est.SALDO, 0) 
                         - ISNULL(pro.AD_ESTMINLV, 0.00) END AS '_stock', EST.SALDO, EST.CODLOCAL
FROM            JIVA.TGFPRO AS PRO WITH (nolock) INNER JOIN
                             (SELECT        id, sku
                               FROM            OPENQUERY(woocommerce, 'select id, sku from wp_ixd5jn_posts where post_type = ''product'' and post_status = ''publish'' and sku is not null') AS derivedtbl_1) AS WOO ON 
                         WOO.sku = PRO.CODPROD LEFT OUTER JOIN
                             (SELECT        CODPROD, CODLOCAL, SUM(ESTOQUE - RESERVADO) AS SALDO
                               FROM            JIVA.TGFEST WITH (NOLOCK)
                               WHERE        (CODEMP = 1) 
                               GROUP BY CODLOCAL, CODPROD) AS EST ON EST.CODPROD = PRO.CODPROD LEFT OUTER JOIN
                             (SELECT        post_id, meta_value
                               FROM            OPENQUERY(woocommerce, 'select post_id, meta_value from wp_ixd5jn_postmeta where meta_key = ''_sale_price''') AS derivedtbl_2) AS PRC ON PRC.post_id = WOO.id LEFT OUTER JOIN
                             (SELECT        post_id, meta_value
                               FROM            OPENQUERY(woocommerce, 'select post_id, meta_value from wp_ixd5jn_postmeta where meta_key = ''_price''') AS derivedtbl_3) AS preco ON preco.post_id = WOO.id LEFT OUTER JOIN
                             (SELECT        post_id, meta_value
                               FROM            OPENQUERY(woocommerce, 'select post_id, meta_value from wp_ixd5jn_postmeta where meta_key = ''_stock''') AS derivedtbl_4) AS ES ON ES.post_id = WOO.id LEFT OUTER JOIN
                             (SELECT        post_id, meta_value
                               FROM            OPENQUERY(woocommerce, 'select post_id, meta_value from wp_ixd5jn_postmeta where meta_key = ''_stock_status''') AS derivedtbl_5) AS EST_ST ON EST_ST.post_id = WOO.id LEFT OUTER JOIN
                         JIVA.TGFDES AS D ON D.CODPROD = PRO.CODPROD AND D.DTINICIAL <= GETDATE() AND D.DTFINAL >= GETDATE() AND D.CODTAB = 15
WHERE        (PRO.AD_USADOLV = 'S') AND (PRO.ATIVO = 'S') AND (PRO.AD_ATIVOLV = 'D') AND (EST.CODLOCAL = 1000) 





	AND (
	
	(cast(cast(PRC.meta_value as varchar(10)) as decimal(15,2)) != case when d.VLRVENDA > 0 then d.VLRVENDA else case when d.PERCENTUAL > 0 then cast(jiva.SNK_PRECO(0,PRO.CODPROD) * ((100-d.PERCENTUAL)/100) as decimal (15,2)) else case when d.VLRDESC > 0 then jiva.SNK_PRECO(0,PRO.CODPROD) - d.VLRDESC else jiva.SNK_PRECO(0,PRO.CODPROD) end end end)
	or
	(cast(cast(preco.meta_value as varchar(10)) as decimal(15,2)) != case when d.VLRVENDA > 0 then d.VLRVENDA else case when d.PERCENTUAL > 0 then cast(jiva.SNK_PRECO(0,PRO.CODPROD) * ((100-d.PERCENTUAL)/100) as decimal (15,2)) else case when d.VLRDESC > 0 then jiva.SNK_PRECO(0,PRO.CODPROD) - d.VLRDESC else jiva.SNK_PRECO(0,PRO.CODPROD) end end end)
	
	or (cast(cast(ES.meta_value as varchar(10)) as decimal(15,2)) != CASE WHEN ISNULL(est.SALDO,0)-ISNULL(pro.AD_ESTMINLV,0) <= 0 THEN 0 ELSE ISNULL(est.SALDO,0)-ISNULL(pro.AD_ESTMINLV,0) END)
	)

	OPEN EXPORTACAO_STATUS
	FETCH NEXT FROM EXPORTACAO_STATUS INTO @CODPROD, @POST_ID, @PRECOWOO, @PRECODESCJIVA, @PRECOPADRAOJIVA, @ESTOQUEWOO, @ESTOQUEJIVA
	WHILE @@FETCH_STATUS = 0
	BEGIN
	
		
		/* Se o preço calculado no Jiva é diferente do preço que está ativo na loja, faz um update nos campos */
		IF @PRECODESCJIVA != CAST(@PRECOWOO AS DECIMAL(15,2))
		begin
			UPDATE OPENQUERY(WOOCOMMERCE,'SELECT `post_id`, `meta_key`, `meta_value` from `wp_ixd5jn_postmeta`')
			set meta_value = CAST(@PRECODESCJIVA AS VARCHAR(10)) where post_id = @POST_ID and meta_key = '_sale_price';
		end

		/* Se o preço calculado no Jiva é diferente do preço que está ativo na loja, faz um update nos campos */
		IF @PRECOPADRAOJIVA != CAST(@PRECOWOO AS DECIMAL(15,2))
		BEGIN
			UPDATE OPENQUERY(WOOCOMMERCE,'SELECT `post_id`, `meta_key`, `meta_value` from `wp_ixd5jn_postmeta`')
			set meta_value = CAST(@PRECOPADRAOJIVA AS VARCHAR(10)) where post_id = @POST_ID and meta_key = '_regular_price';
		END

		IF @PRECODESCJIVA != CAST(@PRECOWOO AS DECIMAL(15,2)) AND @PRECODESCJIVA != @PRECOPADRAOJIVA
		BEGIN
			UPDATE OPENQUERY(WOOCOMMERCE,'SELECT `post_id`, `meta_key`, `meta_value` from `wp_ixd5jn_postmeta`')
			set meta_value = CAST(@PRECODESCJIVA AS VARCHAR(10)) where post_id = @POST_ID and meta_key = '_price';
		end
		ELSE
		BEGIN
			UPDATE OPENQUERY(WOOCOMMERCE,'SELECT `post_id`, `meta_key`, `meta_value` from `wp_ixd5jn_postmeta`')
			set meta_value = CAST(@PRECOPADRAOJIVA AS VARCHAR(10)) where post_id = @POST_ID and meta_key = '_price';

		END

		/* Se o estoque calculado no Jiva é diferente do estoque que está ativo na loja, faz um update nos campos */
		IF @ESTOQUEJIVA != CAST(@ESTOQUEWOO AS DECIMAL(15,2))
		BEGIN
			UPDATE OPENQUERY(WOOCOMMERCE,'SELECT `post_id`, `meta_key`, `meta_value` from `wp_ixd5jn_postmeta`')
			set meta_value = CAST(@ESTOQUEJIVA AS VARCHAR(10)) where post_id = @POST_ID and meta_key = '_stock';
		END


	FETCH NEXT FROM EXPORTACAO_STATUS INTO @CODPROD, @POST_ID, @PRECOWOO, @PRECODESCJIVA, @PRECOPADRAOJIVA, @ESTOQUEWOO, @ESTOQUEJIVA
	END
	CLOSE EXPORTACAO_STATUS
	DEALLOCATE EXPORTACAO_STATUS
END


Mensagem 8114, Nível 16, Estado 5, Linha 67
Erro ao converter tipo de dados varchar em numeric.



Conteúdo do Selec:

CODPROD	post_id	woocommercesaleprice	_price	_regular_price	PRECOPADRAOWOO	woocommercestock	_stock	SALDO	CODLOCAL
7094	          8394	              72.33	                 72,33             72,33	                    72.33	                               3.00	                     3	            13	1000
7097	          8395	             114.44	                114,44	       114,44	                    114.44	                     instock	             3	            13	1000


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

30/07/2020

abaixo as colunas que são resultado da select:
PRO.CODPROD
WOO.id AS post_id
PRC.meta_value AS woocommercesaleprice
JIVA.FN_PRECO_VENDA_ECOMMERCE(PRO.CODPROD) AS '_price'
JIVA.FN_PRECO_VENDA_ECOMMERCE_PADRAO(PRO.CODPROD) AS '_regular_price'
preco.meta_value AS PRECOPADRAOWOO
ES.meta_value AS woocommercestock
CASE WHEN ISNULL(est.SALDO, 0) - ISNULL(pro.AD_ESTMINLV, 0.00) <= 0 THEN 0 ELSE ISNULL(est.SALDO, 0) - ISNULL(pro.AD_ESTMINLV, 0.00) END AS '_stock'
EST.SALDO
EST.CODLOCAL

agora as variáveis que irão receber esses valores:
@CODPROD
@POST_ID
@PRECOWOO
@PRECODESCJIVA
@PRECOPADRAOJIVA
@ESTOQUEWOO
@ESTOQUEJIVA

o retorno que você apresentou:
CODPROD post_id woocommercesaleprice    _price  _regular_price  PRECOPADRAOWOO  woocommercestock    _stock  SALDO   CODLOCAL
7094    8394                   72.33     72,33           72,33           72.33              3.00         3     13   1000
7097    8395                  114.44    114,44          114,44          114.44           instock         3     13   1000

ou seja:
@CODPROD = CODPROD
@POST_ID = post_id
@PRECOWOO = woocommercesaleprice
@PRECODESCJIVA = _price
@PRECOPADRAOJIVA = _regular_price
@ESTOQUEWOO = PRECOPADRAOWOO
@ESTOQUEJIVA = woocommercestock

se eu tabulei o resultado corretamente, no segundo registro o campo woocommercestock é um varchar com conteúdo 'instock'.
se for mesmo assim, o motor do banco não está conseguindo transformar 'instock' num número para atribuir à variável @ESTOQUEJIVA.

GOSTEI 1
Ronaldo Pontes

Ronaldo Pontes

30/07/2020

abaixo as colunas que são resultado da select:
PRO.CODPROD
WOO.id AS post_id
PRC.meta_value AS woocommercesaleprice
JIVA.FN_PRECO_VENDA_ECOMMERCE(PRO.CODPROD) AS '_price'
JIVA.FN_PRECO_VENDA_ECOMMERCE_PADRAO(PRO.CODPROD) AS '_regular_price'
preco.meta_value AS PRECOPADRAOWOO
ES.meta_value AS woocommercestock
CASE WHEN ISNULL(est.SALDO, 0) - ISNULL(pro.AD_ESTMINLV, 0.00) <= 0 THEN 0 ELSE ISNULL(est.SALDO, 0) - ISNULL(pro.AD_ESTMINLV, 0.00) END AS '_stock'
EST.SALDO
EST.CODLOCAL

agora as variáveis que irão receber esses valores:
@CODPROD
@POST_ID
@PRECOWOO
@PRECODESCJIVA
@PRECOPADRAOJIVA
@ESTOQUEWOO
@ESTOQUEJIVA

o retorno que você apresentou:
CODPROD post_id woocommercesaleprice    _price  _regular_price  PRECOPADRAOWOO  woocommercestock    _stock  SALDO   CODLOCAL
7094    8394                   72.33     72,33           72,33           72.33              3.00         3     13   1000
7097    8395                  114.44    114,44          114,44          114.44           instock         3     13   1000

ou seja:
@CODPROD = CODPROD
@POST_ID = post_id
@PRECOWOO = woocommercesaleprice
@PRECODESCJIVA = _price
@PRECOPADRAOJIVA = _regular_price
@ESTOQUEWOO = PRECOPADRAOWOO
@ESTOQUEJIVA = woocommercestock

se eu tabulei o resultado corretamente, no segundo registro o campo woocommercestock é um varchar com conteúdo 'instock'.
se for mesmo assim, o motor do banco não está conseguindo transformar 'instock' num número para atribuir à variável @ESTOQUEJIVA.




Emerson muito obrigado pela ajuda, muitas variáveis nessa consulta, conseguir pegar algumas.

Valeu!!!
GOSTEI 0
POSTAR