Errore store procedure con Clausola Case all'interno

lunedì 27 luglio 2009 - 11.34

sanfra Profilo | Junior Member

Salve ho un problema con una store procedure dove mi dà il seguente errore:
Se una sottoquery non è introdotta da EXISTS, nell'elenco di selezione è possibile specificare una sola espressione.

la mia store deve semplicemente fare una ricerca in base a dei parametri di input , questi parametrinon sono tutti riempiti, ci possono essere anche alcuni vuoti.

Di conseguenza io faccio questa stored procedure:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
L'impostazione delle tabelle è la seguente:
la tabella Bollettino:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

La tabella Causale:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Infine la tabella Utente:

[code]CREATE TABLE [dbo].[Utenti](
[idUtenti] [int] IDENTITY(1,1) NOT NULL,
[Cognome] [varchar](50) NOT NULL,
[Nome] [varchar](50) NOT NULL,
[Via] [varchar](150) NOT NULL,
[Telefono] [varchar](15) NULL,
[Comune] [varchar](50) NOT NULL,
[Cap] [char](5) NOT NULL,
[Provincia] [char](2) NOT NULL,
[Cf] [varchar](16) NULL,
CONSTRAINT [PK_Utenti] PRIMARY KEY CLUSTERED
(
[idUtenti] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY][/code


Spero mi possiate aiuatare e spero che la documentazione che vi ho fornito sia sufficiente.

Grazie ancora

alx_81 Profilo | Guru

>Salve ho un problema con una store procedure dove mi dà il seguente
>errore:
ciao

>Spero mi possiate aiuatare e spero che la documentazione che vi ho fornito sia sufficiente.
Non puoi mettere nel THEN o nell' ELSE di un CASE più di un campo, la select con più campi che metti nel case è un errore di sintassi.
Se vuoi "mergiare" n campi al tuo resultset, devi usare delle JOIN oppure, in caso di funzioni alle quali vuoi passare dei campi di altre tabelle (e se hai sql server 2005 o successive), CROSS APPLY.
Se non riesci con le opzioni suddette, prova a indicarci qualche insert di esempio e il resultset che vuoi ottenere.

>Grazie ancora
di nulla!
--

Alessandro Alpi | SQL Server MVP

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

sanfra Profilo | Junior Member

Ciao, allora inizio con il dire che sto utilizzando sql server 2008 express edition(visto che mi sono totalmente dimenticato di farlo presente nel post precedente).

Poi, spiego cosa devo fare e cioè ho un 'interfaccia dove ho dei checkbox per scegliere il tipo di ricerca(precisamente 3 campi con checkbox),naturalemnte posso fare da 1 a n ricerche in questo modo.Inoltre c'è un campo in più nella ricerca che è la data ma è di default libera in modo che io inizi con una ricerca e che alle ricerca successive che si aggiungeranno potrò usufruire dell'and nella query.

La cosa che ti chiedo adesso e se mi puoi fare un esempio o mi potresti dare un link sulla clausola case, che riguarda specificatamente la mia situazione.


Grazie ancora

alx_81 Profilo | Guru

>La cosa che ti chiedo adesso e se mi puoi fare un esempio o mi
>potresti dare un link sulla clausola case, che riguarda specificatamente
>la mia situazione.
ci sono tre modi per dare la possibilità all'utente di fare ricerche di questo tipo.
1) avere pazienza e scrivere uno statement sql (meglio una stored procedure) per ogni caso. Macchinosissimo, ma pulito. Modulare, ma poco produttivo. Non molto manutenibile.
2) creare condizioni con parametri fatte in questo modo: WHERE @Parametro IS NULL OR @campo = @Parametro, di facile creazione, ma con piani di esecuzione tutt'altro che performanti e al di fuori di ogni bello stile di programmazione
3) sql dinamico, ovvero una stored procedure che crea dinamicamente l'sql da eseguire che poi verrà lanciato dalla sp_executeSql.

puoi scegliere quale usare per gestire la tua casistica. Sinceramente una case non la trovo corretta, se ho capito bene il problema.

--

Alessandro Alpi | SQL Server MVP

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

sanfra Profilo | Junior Member

Ciao, anche io avevo pensato ad un alternativa un pò più valida, del case, e nel frattempo che tu mi rispondessi ho provato a rifare la mia stored procedure, iniziando a dichiararmi una variabile di tipo varchar:
Declare @sql nvarchar(2000)
e all'interno mettere la query sql.


Cmq il codice completo è il seguente:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra



>3) sql dinamico, ovvero una stored procedure che crea dinamicamente
>l'sql da eseguire che poi verrà lanciato dalla sp_executeSql.
Per
caso è questo quello che volevi dire come terza opzione?


Grazie ancora per il tuo aiuto

alx_81 Profilo | Guru

>caso è questo quello che volevi dire come terza opzione?
la 3) è quella che hai seguito tu
--

Alessandro Alpi | SQL Server MVP

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

sanfra Profilo | Junior Member

grazie ancora per non avermi abbandonato.
Se mi ritrovo degli errori ti ritrovo qui a darmi ancora un ultimo suggerimento?


Grazie di tutto.

alx_81 Profilo | Guru

>grazie ancora per non avermi abbandonato.
>Se mi ritrovo degli errori ti ritrovo qui a darmi ancora un ultimo suggerimento?
certo, e se pensi che la risposta ti abbia aiutato accettala che chiudiamo il thread.
--

Alessandro Alpi | SQL Server MVP

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

sanfra Profilo | Junior Member

> e se pensi che la risposta ti abbia aiutato accettala
>che chiudiamo il thread.

Più che mi hai aiutato, mi hai salvato....
cmq adesso ho un problema con le date e più precisamente, quando vado ad eseguire la stored, nei parametri(i due valori datetime sono di tipo varchar) gli assegno questi valori datainiziale: 2009-07-01 00:00:00 e datafinale:2009-07-31 00:00:00 e nel codice è così
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

ma lui mi dà l'errore:
Msg 241, Level 16, State 1, Procedure Ricerca, Line 21
Conversione non riuscita durante la conversione di una stringa di caratteri in una data o ora.

In cosa sto sbagliando, anche un link mi sarebbe utilissimo.

Grazie ancora

sanfra Profilo | Junior Member

Non riesco assolutamente ad andare avanti, ho provato a fare più di una conversione ma senza nessun risultato.
un' altra manina di aiuto....?


Grazie

alx_81 Profilo | Guru

>Non riesco assolutamente ad andare avanti, ho provato a fare
>più di una conversione ma senza nessun risultato.
>un' altra manina di aiuto....?
Non puoi evitare di passare varchar? Usa datetime che eviti di convertire no?

--

Alessandro Alpi | SQL Server MVP

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

sanfra Profilo | Junior Member

avevo già provato questa soluzione da te consigliata

ma passando i parametri datetime all'interno della variabile sql varchar :

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

mi dà l'errore inverso e cioè
Errore durante la conversione del tipo di dati da nvarchar a datetime.

P.S.: i parametri che gli passo alla stored come data sono : data ìiniziale 2009-07-01
e datafinale 2009-07-31

Hai un idea a tal proposito?

alx_81 Profilo | Guru

>avevo già provato questa soluzione da te consigliata
allora, facciamo un po' di chiarezza.
Se hai un'applicazione che richiama la tua stored procedure e devi passare come parametri delle date, usa datetime (o smalldatetime, dipende dalla precisione che ti serve).
Quindi sia nell'applicazione che nella stored procedure, tipo di dato DATA. Non capisco perchè devi passare da varchar. Chi o cosa te lo impone?
--

Alessandro Alpi | SQL Server MVP

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

sanfra Profilo | Junior Member

Aspetta, il problema nasce quando vado a provare la mia stored e quindi faccio tasto destro sulla stored e clicco Execute Stored Procedure e gli vado a dare i valori che scritto nel post precedente per quanto riguarda le due date, mentre gli altri campi li imposto a NULL.

quando vado a eseguire la stored in questo modo mi dà errore di conversione.

il varchar che tu hai visto prima negli altri post era solo una prova che io stavo facendo per valutare il risultato finale.

C'è qualcosa che mi sfugge?

Grazie

alx_81 Profilo | Guru

>Aspetta, il problema nasce quando vado a provare la mia stored
>e quindi faccio tasto destro sulla stored e clicco Execute Stored
>Procedure e gli vado a dare i valori che scritto nel post precedente
>per quanto riguarda le due date, mentre gli altri campi li imposto
>a NULL.
metti a datetime quei due parametri, e poi passa le date nel formato:

SSAAMMGG HH:mm

e vedrai che funziona
--

Alessandro Alpi | SQL Server MVP

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

sanfra Profilo | Junior Member

Allora io gli ho passato la data 00090701 00:00, dimmi se ho capito bene oppure fammi tu un esempio più per dummies, visto che non riesco ad arrivarci.

Grazie ancora e scusa tanto la mia ottusità

alx_81 Profilo | Guru

>Allora io gli ho passato la data 00090701 00:00, dimmi se ho
>capito bene oppure fammi tu un esempio più per dummies, visto
>che non riesco ad arrivarci.
00090701 0009, no.. il minimo dipende dal tipo di dato di destinazione.. volevi scrivere 2009?
--

Alessandro Alpi | SQL Server MVP

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

sanfra Profilo | Junior Member

Le date che mi ritrovo nel mio db già inserite hanno la seguente dicitura: 2009-07-01

e quindi io dovrei poter confontare lo stesso formato data, da codice io farò in modo di convertire la data fornmato italiano nel formato che vuole lui.

Non ho ben capito che cos'è quel SS davanti all'esempio che tu mi hai dato prima, avevo pensato che erano i secondi....

Sta di fatto che tutt'ora non mi funziona quando vado ad inserire un formato data di qualsiasi genere!

Grazie ancora

alx_81 Profilo | Guru

>Le date che mi ritrovo nel mio db già inserite hanno la seguente
>dicitura: 2009-07-01
Questo non conta.. è un formato di stringa.. non è il valore. Le date sono salvate in numerico.

>Non ho ben capito che cos'è quel SS davanti all'esempio che tu
>mi hai dato prima, avevo pensato che erano i secondi....
SECOLOSECOLOANNOANNOMESEMESEGIORNOGIORNO
SSAAMMGG

Formato ISO:
http://www.w3.org/TR/NOTE-datetime
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5