Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Cláusula SQL IN no procedimento armazenado


Existem várias maneiras de fazer isso:

  1. SQL dinâmico, conforme indicado neste artigo:http://asheej.blogspot.com/2012/04/how-to-use-ms-sql-in-clause-with.html

  2. Especifique cada item em variáveis ​​(isso pode ficar bem feio se você tiver muitos):

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

  3. Escreva uma função de divisão para transformar a string em uma variável de tabela, existem muitas delas por aí. Este é o meu favorito:http://dataeducation.com/faster -more-scalable-sqlclr-string-splitting/

  4. Use um parâmetro de valor de tabela (2008):http://www.techrepublic.com/blog/datacenter/passing-table-valued-parameters-in-sql-server-2008/168

  5. Aqui está um pequeno truque usando CHARINDEX (observe que esta abordagem não é sargável):

Sua string é assim:'abc,def'

Usando CHARINDEX , você preenche a string de pesquisa e o valor que deseja encontrar na string de pesquisa com seu delimitador. Então, usando meu pequeno exemplo, a string se tornaria ',abc,def,' Observe as vírgulas extras no início e no final. Em seguida, faça a mesma coisa com os dados de campo. Se você tiver vírgulas em seus dados, terá que trocar o delimitador por outra coisa, como char(2), ou ponto e vírgula, ou qualquer outra coisa.

Em seguida, para realizar a pesquisa:
WHERE CHARINDEX ( ',' + expressionToFind + ',' , ',' + expressionToSearch ',') > 0

O preenchimento do delimitador impede que a pesquisa encontre "abcabc", mas encontrará "abc", correspondência exata.

Se você estiver usando 2005, eu pegaria uma função de divisão muito rápida para evitar o uso de SQL dinâmico.