Próbuję debugować czyjeś raporty SQL i umieściłem zapytanie bazowe raportów w oknach zapytań SQL 2012.
Jednym z parametrów, o które prosi raport, jest lista liczb całkowitych. Można to osiągnąć w raporcie za pomocą listy rozwijanej wielokrotnego wyboru. Zapytanie bazowe raportu używa tej listy liczb całkowitych w where
klauzuli, np
select *
from TabA
where TabA.ID in (@listOfIDs)
Nie chcę modyfikować zapytania, które debuguję, ale nie mogę dowiedzieć się, jak utworzyć zmienną na serwerze SQL, która może przechowywać tego typu dane, aby ją przetestować.
na przykład
declare @listOfIDs int
set listOfIDs = 1,2,3,4
Nie ma typu danych, który może przechowywać listę liczb całkowitych, więc jak mogę uruchomić zapytanie raportu na moim serwerze SQL z tymi samymi wartościami co raport?
sql-server
list
tsql
variables
reporting-services
ErickTreetops
źródło
źródło
Odpowiedzi:
Zmienna tabeli
lub
źródło
SET @AddressIDs = (SELECT ID FROM address WHERE Account = 1234)
to zapytanie zwróci wiele identyfikatorów i otrzymuję błąd informujący, że podzapytanie zwróciło więcej niż jeden wynik i jest to niedozwolone. Czy istnieje możliwość utworzenia zmiennej, która będzie przechowywać tablicę, jeśli identyfikatory z podzapytania?Zakładając, że zmienna jest czymś podobnym do:
A procedura składowana używa go w tej formie:
Możesz utworzyć IntList i wywołać procedurę w następujący sposób:
Lub jeśli sam udostępniasz IntList
źródło
Masz rację, w SQL-Server nie ma typu danych, który mógłby przechowywać listę liczb całkowitych. Ale co możesz zrobić, to zapisać listę liczb całkowitych jako ciąg.
Następnie możesz podzielić ciąg na oddzielne wartości całkowite i umieścić je w tabeli. Twoja procedura może już to zrobić.
Możesz również użyć dynamicznego zapytania, aby osiągnąć ten sam wynik:
źródło
W przypadku SQL Server 2016+ i Azure SQL Database dodano funkcję STRING_SPLIT, która byłaby idealnym rozwiązaniem tego problemu. Oto dokumentacja: https://docs.microsoft.com/en-us/sql/t-sql/functions/string-split-transact-sql
Oto przykład:
Wynik zapytania to 1,3
~ Pozdrawiam
źródło
W końcu doszedłem do wniosku, że bez modyfikowania sposobu działania zapytania nie mogę przechowywać wartości w zmiennych. Użyłem profilera SQL, aby złapać wartości, a następnie zakodowałem je na stałe w zapytaniu, aby zobaczyć, jak to działa. Było 18 takich tablic całkowitych, a niektóre miały ponad 30 elementów.
Myślę, że istnieje potrzeba, aby MS / SQL wprowadził do języka kilka dodatkowych typów danych. Tablice są dość powszechne i nie rozumiem, dlaczego nie można ich używać w przechowywanym procencie.
źródło
Nie możesz tego zrobić w ten sposób, ale możesz wykonać całe zapytanie, przechowując je w zmiennej.
Na przykład:
źródło
Istnieje nowa funkcja w SQL o nazwie,
string_split
jeśli używasz listy łańcuchów. Link referencyjny STRING_SPLIT (Transact-SQL)możesz przekazać to zapytanie
in
w następujący sposób:źródło
Używam tego :
1-Zadeklaruj zmienną tabeli tymczasowej w skrypcie swojego budynku:
2-Przydziel do tabeli tymczasowej:
3-Odwołaj się do tabeli, gdy jej potrzebujesz, w instrukcji WHERE:
źródło