Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Klauzula SQL IN w procedurze składowanej

Można to osiągnąć na kilka sposobów:

  1. Dynamiczny SQL, jak wskazano w tym artykule:http://asheej.blogspot.com/2012/04/how-to-use-ms-sql-in-clause-with.html

  2. 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)

  3. 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/

  4. Użyj parametru wartości tabeli (2008):http://www.techrepublic.com/blog/datacenter/passing-table-valued-parameters-in-sql-server-2008/168

  5. 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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dlaczego umieszczenie klauzuli WHERE poza widokiem ma fatalne wyniki?

  2. Dlaczego typ DATETIME SQL Server oszczędza czas w taktach 1/300 sekundy?

  3. Wybierz top 1 z UPDLOCK i READPAST ustawia ekskluzywną blokadę na całym stole

  4. sql grupuj tylko według wierszy, które są w sekwencji

  5. Indeks SQL Server Które powinny być klastrowane?