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

sp_executesql com instrução 'IN'


A razão pela qual não funciona é porque @P1 é tratado como um valor único.

por exemplo. quando @Code é X101,B202, a consulta está apenas sendo executada como:SELECT * FROM Table WHERE RegionCode IN ('X101,B202') Então, está procurando por um RegionCode com o valor contido em @P1. Mesmo quando você inclui aspas simples, tudo o que significa é que o valor pesquisado em RegionCode deve conter essas aspas simples.

Você precisaria realmente concatenar a variável @Code no texto do comando @Cmd sql para que funcione da maneira que você está pensando:
SET @Code = '''X101'',''B202'''
SET @Cmd = 'SELECT * FROM Table WHERE RegionCode IN (' + @Code + ')'
EXECUTE (@Cmd)

Obviamente, porém, isso apenas abre você para a injeção de SQL, então você precisa ter muito cuidado se adotar essa abordagem para se proteger contra isso.

Existem maneiras alternativas de lidar com essa situação em que você deseja passar uma lista dinâmica de valores a serem pesquisados.

Confira os exemplos em meu blog para 2 abordagens que você pode usar com o SQL Server 2005. Uma envolve passar uma lista CSV no formato "Value1,Value2,Value3" que você divide em uma variável TABLE usando uma função definida pelo usuário (há muitas menções a isso abordagem se você fizer uma pesquisa rápida no google ou neste site). Uma vez dividido, você junta essa var TABLE à sua consulta principal. A segunda abordagem é passar um blob XML contendo os valores e usar a funcionalidade XML integrada do SQL Server. Ambas as abordagens são demonstradas com métricas de desempenho nesse link e não requerem SQL dinâmico.

Se você estivesse usando o SQL Server 2008, Parâmetros de valor de tabela seria o caminho a seguir - essa é a terceira abordagem que demonstro nesse link que sai melhor.