Skocz do zawartości

[Raport SQL] Dynamiczne kolumny, a synchronizacja

Polecane posty

Przygotowałem raport, w którym w zależności od wybranego okresu, generowane są kolumny dla miesięcy z wskazanego okresu. O ile funkcja sprawdź zapytanie w edytorze NEXO, zwraca, że wszystko jest ok, o tyle synchronizuj zapytanie nie przepuszcza takiej formy raportu. Efekt dynamicznych kolumn, uzyskałem poprzez zmienną tekstową, w którą wsadziłem zapytanie, dynamicznie uzupełniłem, a na końcu użyłem:

PRINT @sql;
EXEC sp_executesql @sql;

 

Link to postu

Faktycznie jest problem z dynamicznymi sql'ami, gdy dynamicznie generowana jest struktura wyniku zapytania.

Wynika to z tego, że na potrzeby generowania kolumn, wykonywane jest zapytanie zwracające strukturę, które może zachowywać się inaczej niż "pełne zapytanie". Podyktowane to było względami wydajnościowymi.

W poniższym przykładzie widać, że instrukcja IF działa w trybie "pytania o strukturę" inaczej niż instrukcja CASE. 

 

DECLARE @sql NVARCHAR(max)
DECLARE @lineFromIF NVARCHAR(500)
DECLARE @lineFromCASE NVARCHAR(500)
DECLARE @wajcha INT = 1

IF @wajcha=1 
BEGIN
	set @lineFromIF = N', ''IF pierwsza'' as [IF Pierwsza]'
END
ELSE IF @wajcha=2
BEGIN
	set @lineFromIF = N', ''IF druga'' as [IF Druga]'
END
ELSE
BEGIN
	set @lineFromIF = N', ''IF trzecia'' as [IF Trzecia]'
END

set @lineFromCASE = N', ' + CASE 
						WHEN @wajcha = 1 THEN	N'''CASE Pierwsza''		as [CASE Pierwsza]'
						WHEN @wajcha = 2 THEN	N'''CASE Druga''		as [CASE Druga]'
						ELSE 
												N'''CASE Trzecia''		as [CASE Trzecia]'
					END

set @sql = N'SELECT Id,Symbol, Nazwa '
+	@lineFromIF
+	@lineFromCASE
+	N' FROM ModelDanychContainer.Asortymenty'
PRINT @sql

EXEC sp_executesql @sql;

Postaramy się jakoś zaadresować ten problem, ale na teraz nie widzę eleganckiego rozwiązania tego problemu.

Edytowane przez Jerzy Dudra
Link to postu
  • 1 rok później...
×
×
  • Dodaj nową pozycję...