2013-04-23 10 views
10

Eine große Aufgabe für mich. Ich habe ein paar Fragen. Ihr habt mir schon so viel geholfen, aber ich bekomme eine Schwierigkeit nach der anderen und komme unglaublich langsam voran. Diese Fragen beschreiben meine Aufgaben besser.Übergeben von Sätzen und optionalen Parametern an eine gespeicherte Prozedur T-SQL - ASP.NET

Ich habe eine aspx Seite mit den folgenden Kontrollen: TextBox, CheckBoxList, Dropdownlist. Sie werden verwendet, um Suchkriterien anzugeben. Die Datensätze werden aus SQL Server-Datenbank mit einer gespeicherten Prozedur entnommen.

0) Es ist klar, wie Sie einen Text von TextBox übergeben, um ein Produkt nach Namen zu suchen. Keine Fragen hier.

1) Jede CheckBox in CheckBoxList hat einen Wert, die tatsächliche ID einer Produktgruppe in der Datenbank ist. Wenn mehr als ein Ankreuzfeld ausgewählt ist, wie die Liste der IDs an eine gespeicherte Prozedur als einen Satz übergeben, so dass ich IN @IdList verwenden könnte? Welche Variablentypen sollte ich in C# und T-SQL verwenden? Ist es überhaupt möglich?

2) DropDownList das erste Element ist "ALL". Wenn "ALL" ausgewählt ist, muss ich etwas wie NULL an die gespeicherte Prozedur übergeben. Wie man die gespeicherte Prozedur macht, um einen Parameter zu ignorieren, wenn es NULL ist?

Ich bin erschöpft, keine Ideen mehr kommen, ich habe sogar versucht, nach jedem Kriterium getrennt zu suchen, dann gefundene IDs in einzelne Arrays, vergleichen sie und ein Ergebnis Array mit gemeinsamen IDs, aber es gab zahlreiche Probleme hatte ich riesige statische Arrays, ineffiziente Speichernutzung, nicht in der Lage zu erstellen dynamische Arrays, nicht in der Lage zu überprüfen Kreuzung von nur nicht-Null-Elementen zu verwenden und so weiter, ich aufgegeben, so die Idee ...

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 

Antwort

11

Sie können Erzielen Sie optionale Parameter in gespeicherten T-SQL-Prozeduren, indem Sie Standardwerte gleich NULL haben.

Beispiel, wo NULL als „ignorieren diese Parameter“ verwendet wird:

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 

Es ist völlig in Ordnung, um eine gespeicherte Prozedur zu definieren einen Tabellenwertparameter in T-SQL zu nehmen. Hier ist ein Artikel zum Thema http://sqlwithmanoj.wordpress.com/2012/09/10/passing-multipledynamic-values-to-stored-procedures-functions-part4-by-using-tvp/

Wenn Sie weitere Informationen über diese Google nach „Tabellenwertparameter“ müssen

Beispiel unter Verwendung von Mehrwertparameter:

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

Ich änderte meine gespeicherte Prozedur nach Ihrem ersten Beispiel mit NULL und es funktioniert gut. Danke, es hilft wirklich. Aber im zweiten Beispiel bin ich nicht sicher, wie man die Liste der Parameter von C# an die gespeicherte Prozedur weitergibt. Kann ich ein Set oder etwas anderes benutzen? – SWA

+0

Oh, ich denke, TVPs werden nicht funktionieren, ich benutze SQL Server 2005. TVPs werden nicht unterstützt ... Ich werde es verwenden, wenn ich auf Server 2008 migrieren. Aber jetzt habe ich einen anderen Ansatz entwickelt - es ist eine Kombination aus Ihrem ersten Beispiel und Zyklen. Ich überprüfe nur jedes ** CheckBox ** in der ** CheckBoxList ** und wenn es ausgewählt ist, nehme ich den Wert und die Laufprozedur. Wenn es nicht ausgewählt ist, überlasse ich nur ** NULL **. So bekomme ich korrekte Ergebnisse) Vielen Dank. Ich werde es als eine Antwort markieren. Eine wirklich hilfreiche Antwort. – SWA

+0

Freut mich zu hören. Viel Glück. –

8

Ihre Antwort war richtig David, aber es war ein wenig irreführend, weil der Parameter, der NULL entspricht, es nicht optional macht; es muss nur auf eine Wertperiode eingestellt werden. Dies schafft auch optionale Parameter:

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

die somit ohne Umweg alle Parameter ausgeführt werden konnte, das heißt:

EXEC [dbo].[dcspFilterEmpList] 

Ich verstehe, dass dies nicht unbedingt das, was Piscovetz zu tun versucht, aber es scheint, durch denen die tatsächliche Thema Frage gezeigt entsprechen, und es ist ein wichtiger Unterschied.

+0

Wie ich jetzt mit Ihrer Hilfe verstehe ist, dass, wenn die Prozedur den Wert festlegt, dies beim Aufruf optional ist. Ob NULL oder ein bestimmter Wert keine Rolle spielt, solange er in der Prozedurdefinition festgelegt wird –

+1

@ DavidSöderlund: Ja. –

Verwandte Themen