Eu tenho uma consulta Transact-SQL que usa o operador IN. Algo assim:
select * from myTable where myColumn in (1,2,3,4)
Existe uma maneira de definir uma variável para armazenar toda a lista "(1,2,3,4)"? Como devo defini-lo?
declare @myList {data type}
set @myList = (1,2,3,4)
select * from myTable where myColumn in @myList
Respostas:
fonte
fonte
[Err] 42000 - [SQL Server]Must declare the scalar variable "@mylist".
(VALUES (1),(2),(3),(4),(5))
diretamente?Há duas maneiras de lidar com listas dinâmicas de csv para consultas TSQL:
1) Usando uma seleção interna
2) Usando TSQL dinamicamente concatenado
3) Uma terceira opção possível são as variáveis da tabela. Se você possui o SQl Server 2005, pode usar uma variável de tabela. Se você está no Sql Server 2008, pode até passar variáveis de tabela inteira como parâmetro para procedimentos armazenados e usá-lo em uma associação ou como uma subseleção na cláusula IN.
fonte
Use uma função como esta:
Em vez de usar like, você faz uma junção interna com a tabela retornada pela função:
torna-se
Em uma tabela de registro 1M não indexada, a segunda versão demorou cerca de metade do tempo ...
Felicidades
fonte
Observe que, para sistemas de produção ou lista longa, não é recomendável usar dessa maneira, pois pode ser muito mais lento do que o
IN
operador simplessomeColumnName in (1,2,3,4)
(testado usando mais de 8000 itens)fonte
Não, não existe esse tipo. Mas existem algumas opções:
Nenhuma delas é realmente elegante, mas é a melhor que existe.
fonte
ligeira melhoria no @LukeH, não há necessidade de repetir o "INSERT INTO": e a resposta do @ realPT - não é necessário ter o SELECT:
fonte
Sei que agora é antigo, mas TSQL => 2016, você pode usar STRING_SPLIT:
fonte
A partir do SQL2017, você pode usar STRING_SPLIT e fazer o seguinte:
fonte
Se você quiser fazer isso sem usar uma segunda tabela, poderá fazer uma comparação LIKE com um CAST:
Se o campo que você está comparando já for uma sequência, não será necessário CAST.
Ao redor da correspondência da coluna e de cada valor exclusivo em vírgulas, será garantida uma correspondência exata. Caso contrário, um valor de 1 seria encontrado em uma lista contendo ', 4,2,15,'
fonte
Como ninguém mencionou antes, a partir do Sql Server 2016 você também pode usar matrizes json e
OPENJSON (Transact-SQL)
:Você pode testá-lo em sql fiddle demo
Você também pode cobrir casos mais complicados com json com mais facilidade - consulte Lista de valores e intervalo de pesquisa no SQL usando a cláusula WHERE IN com variável SQL?
fonte
Este usa PATINDEX para corresponder os IDs de uma tabela a uma lista inteira delimitada sem dígito.
Notas:
fonte
fonte
Eu acho que você terá que declarar uma string e depois executar essa string SQL.
Dê uma olhada no sp_executeSQL
fonte