2013-04-23 10 views
10

To duże zadanie dla mnie. Mam kilka pytań. Już bardzo mi pomogliście, ale dostaję jedną trudność za drugą i postępuję niewiarygodnie powoli. Te pytania lepiej opisują moje zadania.Przekazywanie zestawów i opcjonalne parametry do procedury składowanej T-SQL - ASP.NET

Mam stronę aspx z następujących opcji: tekstowym CheckBoxList, DropDownList. Służą do określania kryteriów wyszukiwania. Zapisy są pobierane z bazy danych SQL Server przy użyciu procedury składowanej.

0) Jest oczywiste, jak przekazać tekst z TextBox, aby wyszukać produkt według nazwy. Brak pytań tutaj.

1) Każdy CheckBox w CheckBoxList ma wartość, która jest rzeczywisty identyfikator grupy produktów w bazie danych. Jeśli zaznaczono więcej niż jedno pole wyboru, jak przekazać listę identyfikatorów do procedury składowanej jako zestaw, aby można było użyć IN @IdList? Jakie typy zmiennych należy używać w C# i T-SQL? Czy to w ogóle możliwe?

2) Pierwsza pozycja DropDownList to "ALL". Po wybraniu "ALL", muszę przekazać coś podobnego do procedury przechowywanej, np. NULL. Jak uczynić procedura składowana zignorować parametr, jeśli jest to NULL?

Jestem wyczerpany, żadne pomysły nie nadchodzą, próbowałem nawet wyszukiwać według każdego kryterium osobno, a następnie umieszczać znalezione identyfikatory w poszczególnych tablicach, porównywać je i komponować wynikową tablicę z typowymi identyfikatorami, ale było wiele problemów musiałem użyć gigantyczne statycznych tablic, nieefektywnego wykorzystania pamięci, niezdolnymi do tworzenia dynamicznych tablic, w stanie sprawdzić przecięcie tylko elementów niezerowych i tak dalej, więc porzuciłem ten pomysł ...

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 

Odpowiedz

11

Ty możliwe, uzyskać opcjonalne parametry w procedurach składowanych T-SQL, przyjmując wartości domyślne równe NULL.

Przykład gdzie null jest stosowany jako „ignoruj ​​parametru”:

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 

się perfekcyjnie do określenia procedury przechowywanej wziąć parametr tabeli w wartościach T-SQL. Oto artykuł na temat http://sqlwithmanoj.wordpress.com/2012/09/10/passing-multipledynamic-values-to-stored-procedures-functions-part4-by-using-tvp/

Jeśli potrzebujesz więcej informacji o tym Google dla „wycenione tabela parametr”

przykład stosując wielowartościowe parametry:

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

Zmodyfikowałem moją procedurę przechowywaną zgodnie z pierwszym przykładem z NULL i działa dobrze. Dziękuję, to naprawdę pomaga. Ale w drugim przykładzie nie jestem pewien, jak przekazać listę parametrów od C# do procedury przechowywanej. Czy mogę użyć zestawu, czy może czegoś innego? – SWA

+0

Och, domyślam się, że TVP nie będą działały, ja używam SQL Server 2005. TVP nie są obsługiwane ... Użyję tego podczas migracji do serwera 2008. Ale teraz opracowałem inne podejście - to połączenie twojego pierwszego przykład i cykle. Właśnie sprawdzam każdy ** CheckBox ** w ** CheckBoxList ** i jeśli jest wybrany, biorę jego wartość i uruchamiam procedurę. Jeśli nie jest zaznaczone, po prostu przekazuję ** NULL **. Dostaję poprawne wyniki) Dziękuję bardzo. Zaznaczę to jako odpowiedź. Naprawdę pomocna odpowiedź. – SWA

+0

Miło to słyszeć. Powodzenia. –

8

Twoja odpowiedź była prawidłowa David, ale było to trochę mylące, ponieważ parametr równy NULL nie czyni go opcjonalnym; to musi być ustawione na dowolny okres wartości. To również tworzy opcjonalne parametry:

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

Które można w ten sposób zrealizować bez przekazywania jakichkolwiek parametrów, tj.:

EXEC [dbo].[dcspFilterEmpList] 

Rozumiem, że był to niekoniecznie co Piscovetz starał się zrobić, ale wydaje się, aby dopasować dokładniej pokazany rzeczywisty temat pytanie, a jest to ważne rozróżnienie.

+0

Jak rozumiem teraz, z twoją pomocą jest to, że jeśli procedura ustawia wartość, to robi to opcjonalnie, gdy zostanie wywołana. Czy wartość NULL, czy jakaś wartość nie ma znaczenia, o ile zostanie ustawiona w definicji procedury? –

+1

@ DavidSöderlund: Tak. –