PDA

View Full Version : Concatenate in sqlserver2000


L4OA
23-07-2003, 13:42
Saluti a tutti
sapete come si realizza la concatenate in sqlserver2000??
mi spiego:
io ho sempre lavorato con Oracle e spesso ho dovuto usare
la funzione || per dei confronti particolari
il formato è
select * from tabella where campo1||campo2 = 'XXXXXXXXXXX'
dove le x sono una stringa lunga come la somma delle lunghezze
di campo1 e campo2
in sql server ho provato con:
select * from tabella where campo1 + campo2 = 'XXXXXXXXXXX'
ma funziona solo fino a quando la stringa contiene un certo valore
tipo '00012345678' oltre quel valore mi risponde:
Server: Msg 8115, Level 16, State 8, Line 1
Arithmetic overflow error converting numeric to data type numeric.

che cavolo vuol dire??
grazie in anticipo ;)

monkey72
24-07-2003, 01:35
forse è un problema di precisione più grande di campo1 + campo2 rispetto a 'XXXX...' ... boh... questi concetti di conversione, precisione, casting sono un pò ostici :(

cisky
24-07-2003, 13:13
La concatenazione è corretta con l'operatore '+'

Si verifica un errore di conversione ... la maggior parte delle volte è perchè SQL Server opera una conversione automatica del datatype per eseguire il confronto che non è supportata.

Per ovviare a questo problema devi utilizzare l'apposita funzione CAST che opera la conversione della tipologia del dato.

Ad esempio se hai una tabella 'tblA' con un campo 'CampoA' di tipo SmallInt

Se provi ad eseguire questa Query:
SELECT * FROM tblA WHERE tblA.QT + tblA.QT = '1'

Si verifica questo errore:
[Arithmetic overflow error converting expression to data type Smallint.]

Devi cambiare la tua SQL in questo modo:
SELECT * FROM tblA WHERE CAST(tblA.QT as float) + CAST(tblA.QT as float) ='1'

... ovviamente devi cambiare il datatype in base alle tue esigenze.

Guarda l'Help sulla funzione CAST per vedere le conversioni supportate!

Ciao ;)

monkey72
24-07-2003, 13:49
ma allora ci avevo preso!! :D tnk cisky interessava saperlo anche a me ;)

L4OA
24-07-2003, 14:11
ho provato con as numeric
e non mi da + errore
però il risultato non va bene...
non mi da nessun record
e poi i campi sono già numeric da 6 e 4
il primo contiene 41013 e l'altro una sequenza da 1 a 100
se io gli metto
cast(campo1 AS NUMERIC) + CAST(campo2 AS NUMERIC) > '0410130020'
non ottengo niente....
qualche idea in proposito??
saluti e grazie ;)

disumano
25-07-2003, 02:22
forse sparo una corbelleria...

se usi l'operatore + con due numeri, siamo sicuri che otterrai una stringa composta dai due numeri affiancati e non la loro somma?
forse dovresti fare il casting degli argomenti da numeri a stringhe...
e cioé
SELECT * FROM tabella1 WHERE CAST(campo1 as text) + CAST(campo2 as text) ='XXXXXXXXXXX'

disumano
25-07-2003, 02:33
ho provato a fare una query in access e il modo esatto è questo:

SELECT * FROM tabella1 WHERE cstr(a)+cstr(b)='xxxxxx';

convertendo a e b (campi di tipo numerico) in stringhe.

spero di essere stato d'aiuto.

L4OA
25-07-2003, 11:01
ora sono a casa in malattia
proverò lunedì
ma mi sembra corretto
saluti

cisky
25-07-2003, 13:03
Confermo che funziona!

Perciò la tua SQl sarà:

SELECT * FROM TabellaA WHERE CAST(A as nvarchar)+CAST(B as nvarchar)='XXXXXX'

Ciao!

L4OA
30-07-2003, 14:20
non va...
i campi uniti perdono gli 0 davanti
e quindi se il primo è 0 e il secondo 4 mi diventano 04
e non 0000000004.....
con as text mi dice che nun se pò fa
con char e nvarchar perdo gli zeri e il confronto
mi da risultati sballati...

dr.stein
30-07-2003, 15:00
prova questo: SELECT Format(CAST(A as nvarchar)+CAST(B as nvarchar);"000000") FROM tabella;

dove A e B sono i campi

L4OA
30-07-2003, 15:16
la select:
select * from tb_rivendite
where FORMAT(cast(trvn_precodice_istat as nvarchar) +
cast(trvn_cd_rivendita as nvarchar);"0000000000")
> '0000000004'

la risposta
Server: Msg 170, Level 15, State 1, Line 3
Line 3: Incorrect syntax near ';'.

.....

L4OA
30-07-2003, 15:41
ma che sql è?? mysql??
la format non c'è tra le funzioni di sqlserver2000 :D:D:D

dr.stein
30-07-2003, 15:48
Access!!!

per questo pensavo che in SQL2000 andasse bene!! :D

L4OA
30-07-2003, 15:55
prodotti MS compatibili tra loro???

:rolleyes: utopista :D:D:D

intanto mi sto scaricando il book online della MS x sqlserver
i soliti 36mb.... compressi in .cab :eek:

L4OA
30-07-2003, 16:54
risolto... ovviamente senza l'aiuto del book... :rolleyes:

i pratica se uso la cast as varchar mi tira fuori delle stringhe
prive degli zeri a sx degli importi
quindi mi costruisco la stringa di confronto
eliminando gli zeri a sx :D:D:D

ovvero se avevo 041013 e 0020
al confronto gli passo 04101320
che è la stessa stringa che mi restituisce se la cast la uso nella select
e non nella where

spero di essere stato chiaro ;)

ps
ovviamente accedo a sqlserver2000 con il cobol :D:D:D