sql >> Database teknologi >  >> RDS >> Sqlserver

SQL IN-klausul i lagret procedure

Der er flere måder at opnå dette på:

  1. Dynamisk SQL, som påpeget i denne artikel:http://asheej.blogspot.com/2012/04/how-to-use-ms-sql-in-clause-with.html

  2. Angiv hvert element i variabler (dette kan blive ret grimt, hvis du har mange af dem):

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

  3. Skriv en splitfunktion for at gøre strengen til en tabelvariabel, der er mange af dem derude. Denne er min personlige favorit:http://dataeducation.com/faster -more-scalable-sqlclr-string-splitting/

  4. Brug en tabelværdiparameter (2008):http://www.techrepublic.com/blog/datacenter/passing-table-valued-parameters-in-sql-server-2008/168

  5. Her er et lille trick ved hjælp af CHARINDEX (bemærk, at denne tilgang er ikke-sargerbar):

Din streng er sådan:'abc,def'

Brug af CHARINDEX , udfylder du både søgestrengen og værdien, du ønsker at finde i søgestrengen, med dit delimeter. Så ved at bruge mit lille eksempel, ville strengen blive ',abc,def,' Bemærk de ekstra kommaer i begyndelsen og slutningen. Gør derefter det samme med feltdataene. Hvis du har kommaer i dine data, bliver du nødt til at udskifte delimetret til noget andet, f.eks. char(2) eller semikolon eller hvad som helst.

For derefter at udføre søgningen:

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

Delimeter-polstringen forhindrer søgningen i at finde "abcabc", men vil finde "abc", eksakt match.

Hvis du bruger 2005, ville jeg have fat i en virkelig hurtig split-funktion, så du kan undgå at bruge dynamisk SQL.




  1. Vælg alle rækker, der forekommer på listen over 2927 id'er

  2. SQL Server-format decimaler med kommaer

  3. Oracles specifikation eller SQL's? :Afkort tabel med fremmednøgle begrænsninger

  4. kommasepareret liste som en enkelt streng, T-SQL