Czy istnieje wdzięczny sposób obsługi przekazywania listy identyfikatorów jako parametru do procedury składowanej?
Na przykład chcę, aby działy 1, 2, 5, 7, 20 były zwracane przez moją procedurę składowaną. W przeszłości przekazywałem listę identyfikatorów oddzielonych przecinkami, tak jak w poniższym kodzie, ale czuję się naprawdę brudny, robiąc to.
Myślę, że SQL Server 2005 jest moim jedynym ograniczeniem.
create procedure getDepartments
@DepartmentIds varchar(max)
as
declare @Sql varchar(max)
select @Sql = 'select [Name] from Department where DepartmentId in (' + @DepartmentIds + ')'
exec(@Sql)
sql-server
tsql
stored-procedures
JasonS
źródło
źródło
Odpowiedzi:
Erland Sommarskog od 16 lat utrzymuje autorytatywną odpowiedź na to pytanie: tablice i listy w SQL Server .
Istnieje co najmniej tuzin sposobów przekazywania tablicy lub listy do zapytania; każdy ma swoje unikalne zalety i wady.
Naprawdę nie mogę polecić wystarczająco dużo, aby przeczytać artykuł, aby dowiedzieć się o kompromisach między wszystkimi tymi opcjami.
źródło
Tak, Twoje obecne rozwiązanie jest podatne na ataki typu SQL injection.
Najlepszym rozwiązaniem, które znalazłem, jest użycie funkcji, która dzieli tekst na słowa (jest ich kilka zamieszczonych tutaj lub możesz użyć tego z mojego bloga ), a następnie dołączenie tego do swojej tabeli. Coś jak:
źródło
Jedną z metod, które warto rozważyć, jeśli zamierzasz dużo pracować z wartościami, jest zapisanie ich najpierw w tabeli tymczasowej. Następnie po prostu dołącz do tego jak zwykle.
W ten sposób parsujesz tylko raz.
Najłatwiej jest użyć jednego z UDF 'Split', ale tak wiele osób zamieściło ich przykłady, pomyślałem, że pójdę inną drogą;)
Ten przykład utworzy tymczasową tabelę, do której możesz dołączyć (#tmpDept) i wypełni ją identyfikatorami działów, które przekazałeś. Zakładam, że oddzielasz je przecinkami, ale możesz - oczywiście - zmienić to co chcesz.
Umożliwi to przekazanie jednego identyfikatora działu, wielu identyfikatorów z przecinkami między nimi, a nawet wielu identyfikatorów z przecinkami i spacjami między nimi.
Więc jeśli zrobiłeś coś takiego:
Zobaczysz nazwy wszystkich przekazanych identyfikatorów działów ...
Ponownie, można to uprościć, używając funkcji do zapełnienia tabeli tymczasowej ... Zrobiłem to głównie bez niej, aby zabić nudę :-P
- Kevin Fairchild
źródło
Możesz użyć XML.
Na przykład
Polecenie sp_xml_preparedocument jest wbudowane.
To dałoby wynik:
który ma wszystko (więcej?) tego, czego potrzebujesz.
źródło
Superszybka metoda XML, jeśli chcesz użyć procedury składowanej i przekazać listę identyfikatorów działów oddzielonych przecinkami:
Wszystko zasługa bloga Guru Brada Schulza
źródło
Spróbuj tego:
bardzo prosty.
źródło