sql >> Databasteknik >  >> RDS >> Sqlserver

SQL IN-klausul i lagrad procedur

Det finns flera sätt att åstadkomma detta:

  1. Dynamisk SQL, som påpekats i den här artikeln:http://asheej.blogspot.com/2012/04/how-to-use-ms-sql-in-clause-with.html

  2. Specificera varje objekt i variabler (detta kan bli ganska fult om du har många av dem):

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

  3. Skriv en delad funktion för att förvandla strängen till en tabellvariabel, det finns många av dem där ute. Den här är min personliga favorit:http://dataeducation.com/faster -more-scalable-sqlclr-string-splitting/

  4. Använd en tabellvärdesparameter (2008):http://www.techrepublic.com/blog/datacenter/passing-table-valued-parameters-in-sql-server-2008/168

  5. Här är ett litet trick med CHARINDEX (observera att detta tillvägagångssätt är icke-sargbart):

Din sträng är så här:'abc,def'

Använder CHARINDEX , fyller du på både söksträngen och värdet du vill hitta inom söksträngen med din avgränsare. Så med mitt lilla exempel skulle strängen bli ',abc,def,' Lägg märke till de extra kommatecken i början och slutet. Gör sedan samma sak med fältdata. Om du har kommatecken i din data måste du byta ut avgränsningen till något annat, som char(2), eller semikolon, eller vad som helst.

För att sedan utföra sökningen:

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

Delimeterstoppningen hindrar sökningen från att hitta "abcabc" men hittar "abc", exakt matchning.

Om du använder 2005, skulle jag ta en riktigt snabb delad funktion så att du kan undvika att använda dynamisk SQL.




  1. Hämta det senaste barnet per förälder från stora bordet – frågan är för långsam

  2. Pentaho Data Integration (nyaste versionen) - Upptäcker inte MySQL-drivrutinen

  3. Hur får man namnet på ett dokument i Alfresco med SQL?

  4. TDS Server - Använd Transact-SQL (T-SQL)-uttalanden för att arbeta med Salesforce-data i SQL Server