Curiosità!

giovedì 30 giugno 2011 - 21.04
Tag Elenco Tags  Visual Studio Express  |  SQL Server Express

alexmed Profilo | Guru

Ciao a tutti,
In una tabella di un db SqlServer 2008 Express che ha una colonna di tipo int perchè se nella query scrivo LIKE '%' non dà errori mentre se passo il valore % ad un parametro mi dice "Cast non valido dalla stringa "%" al tipo 'Integer'."?

Grazie dell'attenzione.

alexmed

alx_81 Profilo | Guru

>Ciao a tutti,
Ciao

>In una tabella di un db SqlServer 2008 Express che ha una colonna
>di tipo int perchè se nella query scrivo LIKE '%' non dà errori
>mentre se passo il valore % ad un parametro mi dice "Cast non
>valido dalla stringa "%" al tipo 'Integer'."?
A prescindere dal fatto che like sui numerici non ha senso (va al massimo castato prima di effettuare una ricerca in LIKE), ho provato uno script:

USE tempdb; GO CREATE TABLE #foo (valore tinyint) GO INSERT INTO #foo (valore) VALUES (10) INSERT INTO #foo (valore) VALUES (20) INSERT INTO #foo (valore) VALUES (25) INSERT INTO #foo (valore) VALUES (30) INSERT INTO #foo (valore) VALUES (35) GO DECLARE @param char(1) = '%' -- FUNZIONA SELECT * FROM #foo WHERE valore LIKE '%'; SELECT * FROM #foo WHERE valore LIKE @param; -- ERRORE SET @param = '1' SELECT * FROM #foo WHERE valore + '%' LIKE @param; DROP TABLE #foo; GO

ovviamente quando concateno il carattere % al campo di tipo numerico si arrabbia, negli altri casi sembra andare..

>Grazie dell'attenzione.
di nulla!
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

alexmed Profilo | Guru

>A prescindere dal fatto che like sui numerici non ha senso ...
Ho preso spunto da un esempio della guida in linea in cui si volevano estrarre i numeri di telefono che iniziavano con 415
E in effetti era solo un test in quanto se non ho capito male non esiste un carattere jolly per i numeri.
Probabilmente esiste un metodo diverso per quello che vorrei fare, ovvero:
Se ti passo un valore allora filtrami solo quel valore, se non ti passo niente, restituiscimi tutti i record, senza ricorrere ad un IF o un CASE perchè avrei 5 parametri da passare.
Non mi spiegavo solo come mai ci fosse questa differenza visto, che per come la vedo io (da profano in materia), la query in un modo o nell'altro sarebbe:
... WHERE ID LIKE % ...
>ho provato uno script:

>USE tempdb;
>GO
>
>CREATE TABLE #foo (valore tinyint)
>GO
>
>
>INSERT INTO #foo (valore) VALUES (10)
>INSERT INTO #foo (valore) VALUES (20)
>INSERT INTO #foo (valore) VALUES (25)
>INSERT INTO #foo (valore) VALUES (30)
>INSERT INTO #foo (valore) VALUES (35)
>GO
>
>DECLARE @param char(1) = '%'
>
>-- FUNZIONA
>SELECT * FROM #foo WHERE valore LIKE '%';
>SELECT * FROM #foo WHERE valore LIKE @param;
>
>-- ERRORE
>SET @param = '1'
>SELECT * FROM #foo WHERE valore + '%' LIKE @param;
>
>DROP TABLE #foo;
>GO
>
>ovviamente quando concateno il carattere % al campo di tipo numerico
>si arrabbia, negli altri casi sembra andare..

Stasera faccio delle prove e ti faccio sapere.

>>Grazie dell'attenzione.
>di nulla!
Grazie

alexmed

alx_81 Profilo | Guru

>>A prescindere dal fatto che like sui numerici non ha senso ...
>Ho preso spunto da un esempio della guida in linea in cui si
>volevano estrarre i numeri di telefono che iniziavano con 415
>E in effetti era solo un test in quanto se non ho capito male
>non esiste un carattere jolly per i numeri.
eh no.. però basta castare in stringa e fare la like.

>Probabilmente esiste un metodo diverso per quello che vorrei
>fare, ovvero:
>Se ti passo un valore allora filtrami solo quel valore, se non
>ti passo niente, restituiscimi tutti i record, senza ricorrere
>ad un IF o un CASE perchè avrei 5 parametri da passare.
in tal caso direi qualcosa tipo:

[...]
WHERE @param IS NULL OR numero = @param
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

alexmed Profilo | Guru

>>>A prescindere dal fatto che like sui numerici non ha senso ...
>>Ho preso spunto da un esempio della guida in linea in cui si
>>volevano estrarre i numeri di telefono che iniziavano con 415
>>E in effetti era solo un test in quanto se non ho capito male
>>non esiste un carattere jolly per i numeri.
>eh no.. però basta castare in stringa e fare la like.
Dovrei aver risolto proprio così:

... WHERE (CAST(colonna_int_1 AS varchar(1)) LIKE @param1) AND (CAST(colonna_int_2 AS varchar(1)) LIKE @param2)

Quindi, se passo il valore 1 al parametro mi filtra per quel valore, se al parametro passo il jolly (%) non mi filtra niente.

Penso che tutto ciò non sia molto performante ma dovendo gestire un numero limitato di record (500) non dovrei preoccuparmi, vero?!?!?


alexmed

alx_81 Profilo | Guru

>>>>A prescindere dal fatto che like sui numerici non ha senso ...
>>>Ho preso spunto da un esempio della guida in linea in cui si
>>>volevano estrarre i numeri di telefono che iniziavano con 415
>>>E in effetti era solo un test in quanto se non ho capito male
>>>non esiste un carattere jolly per i numeri.
>>eh no.. però basta castare in stringa e fare la like.
>Dovrei aver risolto proprio così:
>... WHERE (CAST(colonna_int_1 AS varchar(1)) LIKE @param1) AND
>(CAST(colonna_int_2 AS varchar(1)) LIKE @param2)
>
>Quindi, se passo il valore 1 al parametro mi filtra per quel
>valore, se al parametro passo il jolly (%) non mi filtra niente.
>
>Penso che tutto ciò non sia molto performante ma dovendo gestire
>un numero limitato di record (500) non dovrei preoccuparmi, vero?!?!?
per 500 righe di certo non mi preoccuperei. Ovviamente se le 500 righe sono le totali nella destinazione.
Se 500 righe sono il risultato di una query molto più pesante (ad esempio una join che impone una ricerca su tantissimi record) starei attento.
Questo perchè l'utilizzo di funzioni nella where rischia di appesantire il filtro.
Poi c'è da considerare se su quel campo hai almeno un indice che ti aiuta a evitare le i/o, ecc..
Insomma, se l'insieme su cui lavori è piccolo e le richieste sono poche, non mi preoccuperei per nulla.
Poi in alternativa, hai cache applicative, applicazioni del filtro sul livello di biz, persistenza di un campo calcolato (che sarebbe la cast diciamo).
Sono tutti puntini sulle i che dipendono molto dalla tua situazione reale.
A volte, in caso di necessità di query di questo tipo su tantissimi record possono anche essere alleggeriti di molto usando query derivate.
Ma è meglio che mi fermo qui Non fasciamoci la testa prima di averla rotta

--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

alexmed Profilo | Guru

>per 500 righe di certo non mi preoccuperei. Ovviamente se le 500 righe sono le totali nella destinazione.
Si 500 sono i record della tabella master.
Allora procedo così.
Grazie dell'aiuto.
Ciao

alexmed

alexmed Profilo | Guru

Ciao Alessandro,
Sono ritornato sui miei passi perchè avrei trovato una soluzione più pulita ma che fa i capricci.
In pratica i parametri li valorizzo così:

= ISNULL(@Param1; nome_colonna)

E fin qui tutto bene, funziona (se lascio NULL non mi filtra niente, se gli passo un valore esegue il filtro).

Su un campo (Prezzo) avrei bisogno di fare un BEETWEN ... AND e quindi ho impostato così:

>BETWEEN ISNULL(@PMin; Prezzo) AND ISNULL(@PMax; Prezzo) OR (Prezzo IS NULL)

Se lascio NULL va a buon fine se imposto uno dei due o tutti e due i parametri mi dice:

Errore di owerflow aritmetico durante la conversione numeric nel tipo di dati numeric. ()!!!
Il campo Prezzo e di tipo Decimal(18,0)

La cosa strana, che non riesco a capire, è che per le prime volte che eseguivo la query questo errore non me lo restituiva. Possibile?

Cosa sbaglio?

Grazie

alexmed

alx_81 Profilo | Guru

>Su un campo (Prezzo) avrei bisogno di fare un BEETWEN ... AND
>e quindi ho impostato così:
>>Cosa sbaglio?
Così non ti saprei proprio dire. Puoi passarmi la CREATE della tabella e qualche dato di prova?
sembra che sia un errore di scala sul decimal..
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5