sql >> Databáze >  >> RDS >> Sqlserver

Klauzule SQL IN v uložené proceduře

Existuje několik způsobů, jak toho dosáhnout:

  1. Dynamické SQL, jak je uvedeno v tomto článku:http://asheej.blogspot.com/2012/04/how-to-use-ms-sql-in-clause-with.html

  2. Určete každou položku v proměnných (to může být docela ošklivé, pokud jich máte hodně):

    @var1 varchar(20),@var2 varchar(20),@var3 varchar(20)

  3. Napište funkci rozdělení, která změní řetězec na proměnnou tabulky, existuje mnoho z nich. Tohle je můj osobní favorit:http://dataeducation.com/faster -more-scalable-sqlclr-string-splitting/

  4. Použijte parametr hodnoty tabulky (2008):http://www.techrepublic.com/blog/datacenter/passing-table-valued-parameters-in-sql-server-2008/168

  5. Zde je malý trik pomocí CHARINDEXU (všimněte si, že tento přístup je Non-Sargable):

Váš řetězec je takto:'abc,def'

Pomocí CHARINDEX , vyplníte hledaný řetězec i hodnotu, kterou chcete najít v hledaném řetězci, pomocí svého oddělovače. Takže s použitím mého malého příkladu by se řetězec stal ',abc,def', Všimněte si dalších čárek na začátku a konci. Poté proveďte totéž s daty pole. Pokud máte ve svých datech čárky, budete muset vyměnit oddělovač za něco jiného, ​​například char(2) nebo středníky nebo cokoli jiného.

Poté proveďte vyhledávání:

WHERE CHARINDEX ( ',' + expressionToFind + ',' , ',' + expressionToSearch ',') > 0

Oddělovací výplň zabraňuje hledání „abcabc“, ale najde „abc“, přesnou shodu.

Pokud používáte 2005, vzal bych opravdu rychlou funkci rozdělení, abyste se mohli vyhnout použití dynamického SQL.




  1. Možné vložení z data řetězce Vyberte dotaz

  2. Seskupit podle data a zobrazit v datech a časech v sql

  3. Může mít MySql 5.0 pohled na tabulku umístěnou na jiném serveru

  4. Volitelné parametry v uložených procedurách Mysql