Estou tentando depurar os relatórios SQL de outra pessoa e coloquei a consulta de relatórios subjacente em uma janela de consulta do SQL 2012.
Um dos parâmetros solicitados pelo relatório é uma lista de números inteiros. Isso é alcançado no relatório através de uma caixa suspensa de seleção múltipla. A consulta subjacente do relatório usa essa lista inteira na where
cláusula, por exemplo
select *
from TabA
where TabA.ID in (@listOfIDs)
Não quero modificar a consulta que estou depurando, mas não consigo descobrir como criar uma variável no SQL Server que possa conter esse tipo de dados para testá-la.
por exemplo
declare @listOfIDs int
set listOfIDs = 1,2,3,4
Não há nenhum tipo de dados que possa conter uma lista de números inteiros; portanto, como posso executar a consulta de relatório no meu SQL Server com os mesmos valores que o relatório?
fonte
Respostas:
Variável de tabela
ou
fonte
SET @AddressIDs = (SELECT ID FROM address WHERE Account = 1234)
esta consulta retornará vários IDs e eu recebo um erro dizendo que a subconsulta retornou mais de um resultado e isso não é permitido. Existe alguma maneira de criar uma variável que irá armazenar uma matriz se IDs de uma subconsulta?Assumindo que a variável é algo parecido com:
E o procedimento armazenado está usando-o neste formulário:
Você pode criar o IntList e chamar o procedimento da seguinte maneira:
Ou se você estiver fornecendo o IntList você mesmo
fonte
Você está certo, não há tipo de dados no SQL-Server que possa conter uma lista de números inteiros. Mas o que você pode fazer é armazenar uma lista de números inteiros como uma string.
Você pode dividir a sequência em valores inteiros separados e colocá-los em uma tabela. Seu procedimento já pode fazer isso.
Você também pode usar uma consulta dinâmica para obter o mesmo resultado:
fonte
Para o SQL Server 2016+ e o Banco de Dados SQL do Azure, foi adicionada a função STRING_SPLIT que seria uma solução perfeita para esse problema. Aqui está a documentação: https://docs.microsoft.com/en-us/sql/t-sql/functions/string-split-transact-sql
Aqui está um exemplo:
O resultado da consulta é 1,3
~ Felicidades
fonte
No final, cheguei à conclusão de que, sem modificar o funcionamento da consulta, não poderia armazenar os valores em variáveis. Usei o SQL Profiler para capturar os valores e depois os codifiquei na consulta para ver como funcionava. Havia 18 dessas matrizes inteiras e algumas tinham mais de 30 elementos.
Eu acho que é necessário que o MS / SQL introduza alguns tipos de dados adicionais na linguagem. Matrizes são bastante comuns e não vejo por que você não pode usá-las em um processo armazenado.
fonte
Você não pode fazer assim, mas pode executar toda a consulta armazenando-a em uma variável.
Por exemplo:
fonte
Há uma nova função no SQL chamada
string_split
se você estiver usando a lista de cadeias. Link de referência STRING_SPLIT (Transact-SQL)você pode passar esta consulta da
in
seguinte maneira:fonte
Eu uso isso :
1-Declare uma variável da tabela temporária no script do seu edifício:
2-Alocar para a tabela temporária:
3-Faça referência à tabela quando você precisar em uma declaração WHERE:
fonte