Aiuto su Stored Procedure

venerdì 19 marzo 2010 - 16.00

skraus Profilo | Junior Member

Salve ho scritto la seguente SP

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

Il campo idEsito della Tabella MKT_MOTIVI_ESITI è di tipo smallint. Se al parametro @esiti assegno un unico valore (ad esempio 2) SQL Server 2005 me lo casta implicitamente a smallint.

Però io ho la reale esigenza di assegnare al parametro @esiti un insieme di valori (val1, val2, val3, valN) e quando ciò accade, mi genera un errore di casting da nvarchar a smallint.

Come posso fare ?
Grazie
Sk

Ho trovato una soluzione che sembra funzionare.
Ho modificato il tipo dati del parametro esiti da nvarchar(100) in xml.
Quindi assegno al parametro un semplice documento xml strutturato come segue:

<esiti> <esito id="val1" /> <esito id="valN" /> </esiti>

Poi nella seconda query della SP, dopo l'operatore IN ho sostituito il nome del parametro con una istruzione SELECT che trasforma il flusso XML in dati tabellari.

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

Non so se sia una soluzione ottimizzata, però funziona. Se qualcuno ha dei suggerimenti sono comunque graditissimi e ben accetti.

Grazie a tutti. Ciao

alx_81 Profilo | Guru

>Salve
Ciao
questo post riguarda l'annoso problema del passaggio di parametri multiplo .
dipende anche da che RDBMS utilizzi, ma posso dirti che in linea di massima, puoi seguire tre/quattro strade:

- fare ciclo dal chiamante e chiamare N volte il database (decisamente pesante e sconsigliato)
- creare un csv e utilizzarlo poi nella stored procedure come concatenazione di un sql dinamico
- creare un csv e splittarlo nella stored per ottenere una tabella su cui joinare come filtro
- se possiedi la versione 2008 di sql server puoi riempire un parametro di tipo TABLE e poi usare quello (ad esempio con una IN)

>Grazie a tutti. Ciao
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

trappy Profilo | Newbie

ciao Alessandro, hai dei link sulle soluzioni relative all'uso dei file csv che proponi? grazie mille!

alx_81 Profilo | Guru

>ciao Alessandro, hai dei link sulle soluzioni relative all'uso
>dei file csv che proponi? grazie mille!
Ti posso fare un semplice esempio di utilizzo di sql dinamico, però sarebbe meglio che ti scaricassi una funzione per splittare il csv in una tabellina, come questa:
http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=50648
In quel modo poi, puoi andare in join con la tabellina oppure fare la in sul filtro.
Comunque, l'esempio con sql dinamico (che non è il massimo della vita eh) è questo:
USE tempdb; GO CREATE TABLE dbo.Valori ( id int IDENTITY(1, 1) NOT NULL , valore int NOT NULL ) GO INSERT INTO dbo.Valori (valore) VALUES (1) INSERT INTO dbo.Valori (valore) VALUES (2) INSERT INTO dbo.Valori (valore) VALUES (3) INSERT INTO dbo.Valori (valore) VALUES (4) INSERT INTO dbo.Valori (valore) VALUES (5) GO IF EXISTS(SELECT * FROM sysobjects WHERE id = OBJECT_ID(N'dbo.proc_GetData')) DROP PROCEDURE dbo.proc_GetData GO CREATE PROCEDURE dbo.proc_GetData @Filter varchar(255) AS BEGIN SET NOCOUNT ON; DECLARE @strSQL nvarchar(MAX) SET @strSQL = 'SELECT * FROM dbo.Valori WHERE valore in (' + @Filter + ')' EXEC sp_executesql @strSQL END GO -- filtro EXEC dbo.proc_GetData '1,5' GO DROP TABLE dbo.Valori GO
--

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