Existe uma maneira elegante de lidar com a passagem de uma lista de IDs como parâmetro para um procedimento armazenado?
Por exemplo, quero os departamentos 1, 2, 5, 7, 20 retornados pelo meu procedimento armazenado. No passado, eu passei uma lista de IDs delimitadas por vírgulas, como o código abaixo, mas me sinto muito sujo fazendo isso.
O SQL Server 2005 é minha única limitação aplicável, eu acho.
create procedure getDepartments
@DepartmentIds varchar(max)
as
declare @Sql varchar(max)
select @Sql = 'select [Name] from Department where DepartmentId in (' + @DepartmentIds + ')'
exec(@Sql)
sql-server
tsql
stored-procedures
JasonS
fonte
fonte
Respostas:
Erland Sommarskog manteve a resposta oficial para esta pergunta nos últimos 16 anos: Matrizes e listas no SQL Server .
Há pelo menos uma dúzia de maneiras de passar uma matriz ou lista para uma consulta; cada um tem seus próprios prós e contras.
Realmente não posso recomendar o suficiente para ler o artigo e aprender sobre as vantagens e desvantagens de todas essas opções.
fonte
Sim, sua solução atual é propensa a ataques de injeção de SQL.
A melhor solução que eu encontrei é usar uma função que divide o texto em palavras (existem algumas postadas aqui, ou você pode usar essa no meu blog ) e depois juntar isso à sua mesa. Algo como:
fonte
Um método que você pode considerar se estiver trabalhando muito com os valores é gravá-los em uma tabela temporária primeiro. Então você se junta a ele normalmente.
Dessa forma, você está analisando apenas uma vez.
É mais fácil usar uma das UDFs 'Divididas', mas muitas pessoas postaram exemplos delas; achei que eu iria por um caminho diferente;)
Este exemplo criará uma tabela temporária para você participar (#tmpDept) e a preencherá com os IDs de departamento que você inseriu. Suponho que você os esteja separando por vírgulas, mas é possível - é claro - alterar para o que você quiser.
Isso permitirá que você passe um ID de departamento, vários IDs com vírgulas entre eles ou mesmo vários IDs com vírgulas e espaços entre eles.
Então, se você fez algo como:
Você veria os nomes de todos os IDs de departamento pelos quais passou ...
Novamente, isso pode ser simplificado usando uma função para preencher a tabela temporária ... Eu fiz principalmente sem uma só para matar o tédio :-P
- Kevin Fairchild
fonte
Você poderia usar XML.
Por exemplo
O comando sp_xml_preparedocument está embutido.
Isso produziria a saída:
que tem tudo (mais?) do que você precisa.
fonte
Um método XML super rápido, se você quiser usar um procedimento armazenado e passar a lista separada por vírgula de IDs de Departamento:
Todo o crédito vai para o Blog do Guru Brad Schulz
fonte
Tente este:
muito simples.
fonte