sql >> Database >  >> RDS >> Sqlserver

SQL IN-clausule in opgeslagen procedure

Er zijn verschillende manieren om dit te bereiken:

  1. Dynamische SQL, zoals aangegeven in dit artikel:http://asheej.blogspot.com/2012/04/how-to-use-ms-sql-in-clause-with.html

  2. Specificeer elk item in variabelen (dit kan behoorlijk lelijk worden als je er veel hebt):

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

  3. Schrijf een split-functie om de string in een tabelvariabele te veranderen, er zijn er veel. Dit is mijn persoonlijke favoriet:http://dataeducation.com/faster -more-scalable-sqlclr-string-splitting/

  4. Gebruik een tabelwaardeparameter (2008):http://www.techrepublic.com/blog/datacenter/passing-table-valued-parameters-in-sql-server-2008/168

  5. Hier is een kleine truc met CHARINDEX (merk op dat deze aanpak niet-sargeerbaar is):

Je string is als volgt:'abc,def'

CHARINDEX gebruiken , vul je zowel de zoekstring als de waarde die je wilt vinden binnen de zoekstring in met je delimeter. Dus als ik mijn kleine voorbeeld gebruik, zou de string ',abc,def' worden, let op de extra komma's aan het begin en einde. Doe vervolgens hetzelfde met de veldgegevens. Als je komma's in je gegevens hebt, moet je het scheidingsteken verwisselen voor iets anders, zoals char (2), of puntkomma's, of wat dan ook.

Om vervolgens de zoekopdracht uit te voeren:

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

De opvulling met scheidingstekens zorgt ervoor dat de zoekopdracht "abcabc" niet kan vinden, maar zal "abc" vinden, een exacte overeenkomst.

Als je 2005 gebruikt, zou ik een heel snelle split-functie nemen, zodat je het gebruik van dynamische SQL kunt vermijden.




  1. Schakel SQL Server Agent in via SSMS

  2. Genereer ASP.Net Lidmaatschap wachtwoord hash in pure T-SQL

  3. Welke MySQL-database-engine is beter voor het opslaan van sessies en sessiegegevens:MyISAM of InnoDB?

  4. PHP - gebruikt STR_TO_DATE update datetime-kolom maar het is een leeg record bijgewerkt zoals 0000-00-00 00:00:00