Można to osiągnąć na kilka sposobów:
-
Dynamiczny SQL, jak wskazano w tym artykule:http://asheej.blogspot.com/2012/04/how-to-use-ms-sql-in-clause-with.html
-
Określ każdy element w zmiennych (może to być dość brzydkie, jeśli masz ich dużo):
@var1 varchar(20),@var2 varchar(20),@var3 varchar(20)
-
Napisz funkcję podziału, która zamieni łańcuch w zmienną tabeli, jest ich wiele. Ten jest moim ulubionym:http://dataeducation.com/faster -more-scalable-sqlclr-string-splitting/
-
Użyj parametru wartości tabeli (2008):http://www.techrepublic.com/blog/datacenter/passing-table-valued-parameters-in-sql-server-2008/168
-
Oto mała sztuczka z użyciem CHARINDEX (zwróć uwagę, że to podejście jest niepodlegające sargowaniu):
Twój ciąg jest taki:'abc,def'
Korzystanie z CHARINDEX
, dopełniasz zarówno ciąg wyszukiwania, jak i wartość, którą chcesz znaleźć w ciągu wyszukiwania, za pomocą ogranicznika. Używając więc mojego małego przykładu, łańcuch zmieni się w ',abc,def'. Zwróć uwagę na dodatkowe przecinki na początku i na końcu. Następnie zrób to samo z danymi pola. Jeśli masz przecinki w swoich danych, musisz zamienić ogranicznik na coś innego, na przykład char(2), średniki lub cokolwiek.
Następnie, aby przeprowadzić wyszukiwanie:
WHERE CHARINDEX ( ',' + expressionToFind + ',' , ',' + expressionToSearch ',') > 0
Dopełnienie ogranicznika uniemożliwia wyszukiwanie „abcabc”, ale znajdzie „abc”, dokładne dopasowanie.
Jeśli używasz 2005, skorzystałbym z naprawdę szybkiej funkcji dzielenia, dzięki czemu możesz uniknąć używania dynamicznego SQL.