2013-04-23 11 views
10

Un grande compito per me. Ho alcune domande. Voi ragazzi mi avete già aiutato così tanto, ma ho una difficoltà dopo l'altra e progredisco incredibilmente lentamente. Queste domande descriveranno meglio i miei compiti.Passaggio di set e parametri facoltativi a una stored procedure T-SQL - ASP.NET

Ho una pagina aspx con i seguenti controlli: TextBox, CheckBoxList, DropDownList. Sono usati per specificare i criteri di ricerca. I record sono presi da SQL Server Data Base utilizzando una stored procedure.

0) È chiaro come passare un testo da TextBox per cercare un prodotto per nome. Nessuna domanda qui.

1) Ogni CheckBox in CheckBoxList ha un valore che è reale ID di un gruppo di prodotti nel database. Se è selezionata più di una casella di controllo, come passare l'elenco di ID a una stored procedure come set in modo da poter utilizzare IN @IdList? Quali tipi di variabili dovrei usare in C# e T-SQL? È possibile a tutti?

2) Il primo elemento di DropDownList è "ALL". Quando è selezionato "TUTTO", ho bisogno di passare qualcosa come NULL alla stored procedure. Come rendere la stored procedure per ignorare un parametro se è NULL?

Sono esausto, non ci sono più idee, ho persino cercato di cercare separatamente per ciascun criterio, quindi ho messo gli ID trovati in array individuali, li ho confrontati e ho composto un array risultante con ID comuni, ma c'erano numerosi problemi , ho dovuto usare matrici giganti statiche, utilizzo della memoria inefficiente, incapace di creare array dinamici, in grado di controllare intersezione di elementi non nulli solo e così via, quindi abbandonato l'idea ...

CREATE PROCEDURE FilterList 
    @ProductName nvarchar(200), 
    @ProductGroupID int 
AS BEGIN 
SELECT 
    prod_id AS 'ID', 
    prod_name AS 'Name' 
FROM 
    dbo.Products 
WHERE 
    prod_group_id = @ProductGroupID OR 
    prod_name = @ProductName 
END 

risposta

11

Puoi ottenere parametri opzionali nelle stored procedure T-SQL avendo valori di default uguali a NULL.

Esempio dove si usa NULL come "ignorare questo parametro":

CREATE PROCEDURE [dbo].[dcspFilterEmpList] 
    @ProductName nvarchar(200) = null, 
    @ProductGroupID int = null 
AS BEGIN 

    SELECT 
    prod_id AS 'ID', 
    prod_name AS 'Name' 
    FROM dbo.Products 

    WHERE (prod_group_id = @ProductGroupID OR @ProductGroupID IS NULL) 
    AND (prod_name = @ProductName OR @ProductName IS NULL) 

END 

E 'perfettamente definire una procedura immagazzinata per prendere un parametro con valori di tabella in T-SQL. Ecco un articolo sul tema http://sqlwithmanoj.wordpress.com/2012/09/10/passing-multipledynamic-values-to-stored-procedures-functions-part4-by-using-tvp/

Se avete bisogno di più informazioni su Google per "con valori di tabella dei parametri"

Esempio con parametri multivalore:

CREATE TYPE XTV_ProductNames AS TABLE --extension, table valued == XTV 
(ProductName nvarchar(50)) 
GO 
CREATE TYPE XTV_ProductGroups AS TABLE --extension, table valued == XTV 
(ProductGroupID int)) 
GO 
CREATE PROCEDURE [dbo].[dcspFilterEmpList] 
    @TVP1 XTV_ProductNames READONLY 
    ,@TVP2 XTV_ProductGroups READONLY 
AS BEGIN 
    SELECT 
    prod_id AS 'ID', 
    prod_name AS 'Name' 
    FROM dbo.Products as p 
    INNER JOIN @TVP1 as s 
     ON p.prod_name = s.ProductName 
    UNION 
    SELECT 
    prod_id AS 'ID', 
    prod_name AS 'Name' 
    FROM dbo.Products as p 
    INNER JOIN @TVP2 as s 
     ON p.prod_group_id = s.ProductGroupID 
END 
+0

Ho modificato la procedura memorizzata in base al primo esempio con NULL e funziona correttamente. Grazie, aiuta davvero. Ma nel secondo esempio non sono sicuro di come passare l'elenco dei parametri da C# alla stored procedure. Posso usare un set o forse qualcos'altro? – SWA

+0

Oh, immagino che i TVP non funzionino, io uso SQL Server 2005. I TVP non sono supportati ... Lo userò quando migrerò su Server 2008. Ma ora ho sviluppato un altro approccio: è una combinazione del tuo primo esempio e cicli. Controllo solo ** CheckBox ** in ** CheckBoxList ** e se è selezionato, prendo il suo valore ed eseguo la procedura. Se non è selezionato, passo semplicemente ** NULL **. Quindi ottengo risultati corretti) Grazie mille. Lo segnerò come risposta. Una risposta davvero utile. – SWA

+0

Felice di sentirlo. In bocca al lupo. –

8

tua risposta è stata corretta David, ma è stato un po 'fuorviante perché il parametro che eguaglia NULL non lo rende opzionale; deve solo essere impostato su qualsiasi periodo di valore. Questo crea anche parametri opzionali:

CREATE PROCEDURE [dbo].[dcspFilterEmpList] 
    @ProductName nvarchar(200) = 'DefaultProduct', 
    @ProductGroupID int = 1 
AS 

Che potrebbe quindi essere eseguito senza passare alcun parametro, ad esempio.:

EXEC [dbo].[dcspFilterEmpList] 

Mi rendo conto che questo non era necessariamente quello Piscovetz stava cercando di fare, ma sembra avvicinarsi di più l'argomento domanda effettiva mostrato, ed è una distinzione importante.

+0

Come ho capito ora con il tuo aiuto è che se la procedura imposta il valore, che lo rende opzionale quando chiamato. Se NULL o qualche valore non è importante purché venga impostato nella definizione della procedura? –

+1

@ DavidSöderlund: Sì. –

Problemi correlati