Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

brunoguitarman

Problemas com ISNULL gerando TXT

Recommended Posts

Galera, seguinte, o código que estou usando é o seguinte:

 

SELECT  isnull(Cast(replicate('0',(5 - Len(Cast(terreno.nrideter as varchar)))) + Cast(terreno.nrideter as varchar) as varchar(5)),'') as Num, 	isnull(Cast(replicate('0',(3 - Len(Cast(terreno.nrincter as varchar)))) + Cast(terreno.nrincter as varchar) as varchar(3)),'') as Inc,	isnull(terreno.dsideter, '') as Descricao,	isnull(terreno.dssitter, '') as Situacao, 	isnull(localizacao.nmidepla, '') as Localizacao,	isnull(terreno.dsbaiter, '') as Bairro,	isnull(terreno.dslotter, '') as Loteamento,	isnull(terreno.dsquater, '') as Quadra,	isnull(terreno.dsqtrter, '') as Quarteirao,	isnull(terreno.dscerter, '') as Cercamento,	isnull(terreno.vlareter, '') as Area,	isnull(terreno.dsocuter, '') as Ocupacao,	isnull(terreno.dsdecter, '') as Decreto,	isnull(Convert(varchar(8),Convert(varchar(12),terreno.dtdecter,112)), '') as DtDecret,	isnull(terreno.dssenter, '') as Sentenca,	isnull(terreno.dstitter, '') as Titulo,	isnull(Convert(varchar(8),Convert(varchar(12),terreno.dttitter,112)), '') as DtTitulo,	isnull(terreno.dszonter, '') as Zona,	isnull(terreno.dsmatter, '') as Matricula,	isnull(Convert(varchar(8),Convert(varchar(12),terreno.dtmatter,112)), '') as DtMatric,	isnull(terreno.dslivter, '') as Livro,	isnull(terreno.dsfolter, '') as Folha,	isnull(terreno.dsobster, '') as Observacoes,	isnull(Convert(varchar(8),Convert(varchar(12),terreno.dtaquter,112)), '') as DtAqusic,	isnull(replicate('0',(12 - len(convert(varchar,terreno.vlaquter,2)))) + (convert(varchar,terreno.vlaquter,2)),'') as VlOrig,	isnull(Convert(varchar(8),Convert(varchar(12),terreno.dtinidep,112)), '') as DtIniDepFROM	ZCBP7130 as terreno,	ZCBP7040 as localizacaoWHERE   terreno.multiusu = 720 and	terreno.cdidebai = 0 and	localizacao.multiusu = 720 and	localizacao.cdideloc = terreno.cdideloc

Lembre-se que estou recem começando, então, sem muitas críticas ao código :P

 

O resultado que aparece é o seguinte:

 

Num   Inc  Descricao																																																Situacao		Localizacao																						  Bairro											 Loteamento										 Quadra											 Quarteirao																																															   Cercamento										 Area				 Ocupacao			 Decreto			  DtDecret Sentenca			 Titulo			   DtTitulo Zona				 Matricula			DtMatric Livro				Folha				Observacoes																																															  DtAqusic VlOrig																																																														   DtIniDep ----- ---- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------------- ---------------------------------------------------------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------- -------------------- -------------------- -------------------- -------- -------------------- -------------------- -------- -------------------- -------------------- -------- -------------------- -------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------- 00004 000  Descrição																																																PMPA			Endereço não cadastrado																																																																																																																																																																																																																																	20050115 0001000.0000																																																													 20050115(1 row(s) affected)

E eu preciso que realmente seja em um arquivo de texto o resultado, mas, por exemplo ali no início, o primeiro campo é de tamanho 5 e o segundo é 3, mas há um espaço entre eles que não deve existir, bem como em todos os outros campos. Tem alguns que pode-se ver muitos espaços, mas tudo bem, pois por exemplo, um campo com tamanho 50, mesmo que seja vazio, eu devo mostrar 50 espaços em branco, mas o problema é que esse espaço entre os campos não pode aparecer, ou seja, voltando aos dois primeiros campos, ao invés de ser 00004 000, deveria ser 00004000.

 

Alguém sabe o que posso fazer?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Camarada,São duas colunas distintas que você que unir em um único resultado sem espaços?Se for você pode fazer algo assim:

SELECT RTRIM(LTRIM(COL1)) + RTRIM(LTRIM(COL2) AS RESULTADO_SEM_BRANCO
Lmebre-se que se as colunas forem numéricas você deverá convertê-las senão retorna erro.t+

É interessante, até seria minha próxima pergunta, mas não sabe como posso tirar esse espaço entre as colunas. Transformar aquele meu 00004 000 em 00004000?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas isso tira todos os espaços em branco, tanto no início quanto no fim, não? Tem campos char que em tamanho 50 e eu preciso que mesmo que eles estejam preenchidos somente com 15 caracteres, continuem mostrando os outros 35 espaços em branco.Agora tava testando aqui e só colocando o "+" já funciona, mas valeu pela ajuda aí, já é mais uma coisa que aprendi, esse fórum tá ajudando bastante. Aliás, tem algum bom livro ou apostila que vocês indicariam?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Camarada,Postei o TRIM pq você queria retirar o branco mas com a + (soma) você ja concatena os campos desde que sejam todos do msm tipo. Na verdade é RTRIM pra diretira e LTRIM para esquerda.Qual o tipo das duas colunas que você quer concatenar?t+

Falei cedo demais, uma parte dá certo, mas outra não :P

Compartilhar este post


Link para o post
Compartilhar em outros sites

São aquelas do código que coloquei lá em cima, algumas são char, outras datetime e outras integer, mas estão todas convertidas pra varchar.O problema é que quando uma coluna é um Null, ela não ocupa espaço nenhum nessa concatenação. Tentei até colocar tipo isnull(coluna, replicate(' ', tamanho_do_campo) ao invés daquele isnull(coluna, '') que pode ser visto no código que coloquei no primeiro post, mas não funcionou.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Camarada,

 

você vai desculpar minha franqueza mas um código enorme destes desanima. Sei q a postagem do código ajuda e facilida a ajuda mas este é dos gdes.

 

Para facilitar vamos tentar recirar o que queres em menor escala e depois adaptamos a sua expressão.

 

Segue um exemplo simple de concatenação de dois campos VARCHAR():

DECLARE @VAR2 VARCHAR(10), @VAR3 VARCHAR(10) SET @VAR2 = 'TESTE'SET @VAR3 = NULLPRINT  '|' + @VAR2 +  ISNULL(@VAR3,'') + '|'

Com pode ser visto o ISNULL retira o NULL e retorna isto:

|TESTE|

Acho que é isso que você quer!

 

Agora não entendi pq com sua expressão não funfa.

 

 

t+

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ela até funciona, mas se eu não estiver concatenando com nada, por exemplo, se coloco o seguinte:

ltrim(isnull(terreno.dssitter, replicate(' ',15))) +ltrim(isnull(localizacao.nmidepla, replicate(' ',100)))
sendo que terreno.dssitter não é vazio e localizacao.nmidepla é vazio, ou vice-cersa, não funciona, mas se o código for assim:
ltrim(isnull(terreno.dssitter, replicate(' ',15))),ltrim(isnull(localizacao.nmidepla, replicate(' ',100)))
funciona, mas não me serve de nada já que tenho que concatenar os campos.

Agora não entendi pq com sua expressão não funfa.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, galera, vou postar aqui o código, pra quem tiver paciência de ler :P

 

SELECT  isnull(convert(varchar(5),replicate('0',(5 - Len(convert(varchar,terreno.nrideter)))) + convert(varchar,terreno.nrideter)),'') + 	isnull(convert(varchar(3),replicate('0',(3 - Len(convert(varchar,terreno.nrincter)))) + convert(varchar,terreno.nrincter)),'') +	isnull(terreno.dsideter, replicate(' ',200)),	isnull(terreno.dssitter, replicate(' ',15)) + 	isnull(localizacao.nmidepla, replicate(' ',100)) +	isnull(terreno.dsbaiter, replicate(' ',50)) +	isnull(terreno.dslotter, replicate(' ',50)) +	isnull(terreno.dsquater, replicate(' ',50)) +	isnull(terreno.dsqtrter, replicate(' ',200)) +	isnull(terreno.dscerter, replicate(' ',50)) +	isnull(terreno.vlareter, replicate(' ',20)) +	isnull(terreno.dsocuter, replicate(' ',20)) +	isnull(terreno.dsdecter, replicate(' ',20)) +	isnull(Convert(varchar(8),Convert(varchar(12),terreno.dtdecter,112)), replicate(' ',8)) +	isnull(terreno.dssenter, replicate(' ',20)) +	isnull(terreno.dstitter, replicate(' ',20)) +	isnull(Convert(varchar(8),Convert(varchar(12),terreno.dttitter,112)), replicate(' ',8)) +	isnull(terreno.dszonter, replicate(' ',20)) +	isnull(terreno.dsmatter, replicate(' ',20)) +	isnull(Convert(varchar(8),Convert(varchar(12),terreno.dtmatter,112)), replicate(' ',8)) +	isnull(terreno.dslivter, replicate(' ',20)) +	isnull(terreno.dsfolter, replicate(' ',20)) +	isnull(terreno.dsobster, replicate(' ',200)) ,	isnull(Convert(varchar(8),Convert(varchar(12),terreno.dtaquter,112)), replicate(' ',8)) +	isnull(replicate('0',(12 - len(convert(varchar,terreno.vlaquter,2)))) + (convert(varchar,terreno.vlaquter,2)),replicate(' ',12)) +	isnull(Convert(varchar(8),Convert(varchar(12),terreno.dtinidep,112)), replicate(' ',8)) FROM	ZCBP7130 as terreno,	ZCBP7040 as localizacaoWHERE   terreno.multiusu = 720 and	terreno.cdidebai = 0 and	localizacao.multiusu = 720 and	localizacao.cdideloc = terreno.cdideloc

Essa coisa toda gera o seguinte:

 

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 00004000Descrição																																																PMPA		   Endereço não cadastrado																																																						   200501150001000.000020050115(1 row(s) affected)

Como podem ver, fica teoricamente certo, com todos os espaços que preciso que apareçam, etc. O problema é que assim ainda não está correto, pois, no fim da terceira linha e da vigésima terceira, ao invés de uma vírgula preciso de um +, para que fique tudo concatenado, mas aí é que está o grande problema, quando faço isso o resultado que tenho é o seguinte:

 

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 00004000Descrição																																															   PMPA		   Endereço não cadastrado		  (1 row(s) affected)

Ou seja, somem muitos espaços em branco, que estavam ao lado de "Endereço não cadastrado" e, pra completar, o resultado "200501150001000.000020050115" que aparecia no final, que são algumas datas e valores, também some. Acredito que tenha a ver com aquela concatenação com vazio, etc, mas por mais que tenha procurado no help não achei nada muito conclusivo. Alguém acha que consegue me ajudar?

 

ps.: Desculpem pelo tamanho do post, mas acho que é mais simples mostrar tudo de uma vez do que ficar tentando explicar por partes.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Descobri que cada coluna está chegando a, no máximo, 256 caracteres; portanto, realmente irá apagar alguns caracteres. Tem como eu trocar esse limite? no caso eu precisaria, acho que é de uma coluna com 1156 caracteres de largura.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Camarada,

 

você pode criar colunas do tipo VARCHAR de até 4000:

CREATE TABLE #TMP (COD INT, DE_TEXTO VARCHAR(4000))

t+

Compartilhar este post


Link para o post
Compartilhar em outros sites

Desculpa a ignorância, mas como faço pra passar o que concatenei para esse campo de tamanho 4000?

Camarada,você pode criar colunas do tipo VARCHAR de até 4000:

CREATE TABLE #TMP (COD INT, DE_TEXTO VARCHAR(4000))
t+

Compartilhar este post


Link para o post
Compartilhar em outros sites

Camarada,

 

O exemplo cria um tabela inseri 3 campos alfa e depois concatena o resultado em um variável VARCHAR(4000).

CREATE TABLE #TMP (COD INT, DE_TEXTO1 VARCHAR(100), DE_TEXTO2 VARCHAR(80), DE_TEXTO3 VARCHAR(150))INSERT INTO #TMP (COD,DE_TEXTO1,DE_TEXTO2, DE_TEXTO3) VALUES 						(1,'DEZ ANOS JA E NENHUMA GOTA ME ALCANÇOU...',						'OS MORTOS SÃO OS VIVOS DE FERIAS',						'OI OLA')DECLARE @JUNTA VARCHAR(4000)SELECT @JUNTA = DE_TEXTO1 + ' | ' + DE_TEXTO2 + '|' + DE_TEXTO3FROM #TMPPRINT @JUNTADROP TABLE #TMP

Agora tudo depende de sua ambiente e realidade.

 

você quer aumentar o tamanho de uma coluna (campo de um tabela) ou variável?

 

t+

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pra variar acabei achando outro problema, heheh, acho que não vou acabar isso nunca...Usando o declare e o print dá certo, só que só pra uma linha, se tiver mais que uma já estraga tudo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

você quer aumentar o tamanho de uma coluna (campo de um tabela) ou variável?

Eu quero aumentar a largura do campo que vai ter a resposta, pois simplesmente fazendo a concatenação dos campos, o campo que mostrará a resposta terá, no máximo, 255(ou 256) caracteres, sendo que preciso de 1155.Usando o declare, coloquei uma variável desse tamanho que serve pra pegar o resultado de todos os campos concatenados e depois uso o print pra mostrar na tela, o problema é que serve para quando a consulta tem apenas uma linha de resposta, mas quando tem mais de uma isso fica com problema. Obviamente minha lógica está incorreta, mas, por falta de experiência, não sei o que alterar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Camarada,você ainda esta utilizando o SELECT q postou no primeiro post?Estes caracteres que você esta afirmando que estão desaparecendo desaparecem inclusive na execução do Query Analyzer? Ou na sua aplicação?Porque se você esta concatenando duas colunas o resultado não esta sendo atribuida a nenhuma delas e sim a um outro campo cujo o tamanho é o somatório dos dois campos. Não têm como você definir o tamanho de uma coluna que é criada dinamicamente. Para utilzar o exemplo:

SELECT @JUNTA = DE_TEXTO1 + ' | ' + DE_TEXTO2 + '|' + DE_TEXTO3FROM #TMPPRINT @JUNTA
Seria preciso abrir u CURSOR e navega em cada registro efetuando a concatenação e gravar em um temporária ou qq outra tabela e depois lista o conteúdo ja concatenado.O PRINT não irá resolver sue problema pois ele somente imprime o conteúdo de uma variável. O exemplo foi generico pois realmente não entendi bem o que você quer apesar de tantas respostas. :unsure: t+

Descobri que cada coluna está chegando a, no máximo, 256 caracteres; portanto, realmente irá apagar alguns caracteres. Tem como eu trocar esse limite? no caso eu precisaria, acho que é de uma coluna com 1156 caracteres de largura.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, o select ainda é o mesmo, com a diferença de que eu usei o "+" pra fazer a concatenação de todos os campos.Os caracteres que desaparecem são aqueles que estão depois da posição 255 do campo resultante, pois o campo resultante só chega até esse tamanho. Como tu disse, esse campo resultante pode até ser a soma dos tamanhos dos campos concatenados, mas não está passando de 255. Não tem como eu modificar esse limite de tamanho dele, mesmo que seja por alguma opção, não por código?Tudo que estou fazendo é no query analizer, ainda não passei para nenhuma aplicação até por que acho que essa parte não serei eu a fazer.E essa última parte que tu falou de abrir o cursor, como se faz?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.