🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.bazy-danych
13 messages
13 total messages Started by Adam Fri, 15 Jun 2018 13:29
Dziwne zmienne w MS-SQL
#195606
Author: Adam
Date: Fri, 15 Jun 2018 13:29
36 lines
1479 bytes
Witajcie.

Dlaczego zmienne w pewnych sytuacjach nie działają jak zmienne?

Przykład _NIE_ działający:

use master

declare @TaBelKa nvarchar(40)
set @TaBelKa = 'sys.tables'
select * from @TaBelKa

Zmienna niby jest "napompowana" wartością, gdyż select @TaBelKa  zwraca 
wartość prawidłową.


Dlaczego trzeba tworzyć jakieś karkołomne konstrukcje typu:

use master

declare @TaBelKa nvarchar(40)
set @TaBelKa = 'sys.tables'
DECLARE @SQL NVARCHAR(100)
SET @SQL = N'SELECT * FROM ' + @TaBelKa
EXECUTE sp_executesql @SQL


Ki diabeł?
O co chodzi?



-- 
Pozdrawiam.

Adam
Re: Dziwne zmienne w MS-SQL
#195607
Author: Stokrotka
Date: Fri, 15 Jun 2018 16:03
39 lines
1958 bytes

> Dlaczego zmienne w pewnych sytuacjach nie działają jak zmienne?
>
> Przykład _NIE_ działający:
>
> use master
>
> declare @TaBelKa nvarchar(40)
> set @TaBelKa = 'sys.tables'
> select * from @TaBelKa
>
> Zmienna niby jest "napompowana" wartością, gdyż select @TaBelKa  zwraca 
> wartość prawidłową.
>
>
> Dlaczego trzeba tworzyć jakieś karkołomne konstrukcje typu:
>
> use master
>
> declare @TaBelKa nvarchar(40)
> set @TaBelKa = 'sys.tables'
> DECLARE @SQL NVARCHAR(100)
> SET @SQL = N'SELECT * FROM ' + @TaBelKa
> EXECUTE sp_executesql @SQL
>
>
> Ki diabeł?
> O co chodzi?
>
Wydaje mi się, że coś utrudniasz.
Według mnie pierwszy pszykład nie powinien iść,
a drugi to jakaś skomplikowana kopia
z jakiegoś pszykładu, gdzie nie wszystko jest niezbędne.

-- 
(tekst bez: ó, ch, rz i -ii)
Ortografia to NAWYK, często nielogiczny, ktury ludzie ociężali umysłowo,
nażucają bezmyślnie następnym pokoleniom. ( ortografia . pev . pl ) 
Re: Dziwne zmienne w MS-SQL
#195608
Author: Adam
Date: Sat, 16 Jun 2018 10:45
362 lines
14062 bytes
W dniu 2018-06-15 o 18:03, Stokrotka pisze:
> 
> 
>> Dlaczego zmienne w pewnych sytuacjach nie działają jak zmienne?
>>
>> Przykład _NIE_ działający:
>>
>> use master
>>
>> declare @TaBelKa nvarchar(40)
>> set @TaBelKa = 'sys.tables'
>> select * from @TaBelKa
>>
>> Zmienna niby jest "napompowana" wartością, gdyż select @TaBelKa  
>> zwraca wartość prawidłową.
>>
>>
>> Dlaczego trzeba tworzyć jakieś karkołomne konstrukcje typu:
>>
>> use master
>>
>> declare @TaBelKa nvarchar(40)
>> set @TaBelKa = 'sys.tables'
>> DECLARE @SQL NVARCHAR(100)
>> SET @SQL = N'SELECT * FROM ' + @TaBelKa
>> EXECUTE sp_executesql @SQL
>>
>>
>> Ki diabeł?
>> O co chodzi?
>>
> Wydaje mi się, że coś utrudniasz.

Może4sz wyjaśnić znaczenie "utrudniasz"?

> Według mnie pierwszy pszykład nie powinien iść,

Uzasadnienie?

Zakładam zmienną:
	declare @TaBelKa nvarchar(40)

Wypełniam wartością:
	set @TaBelKa = 'sys.tables'

Sprawdzam, czy wartość jest:
	select @TaBelKa

Zwraca prawidłową wartość.

Więc nieco inaczej, np:
	select 'wartość zmiennej: ' + @TaBelKa + ', a dzisiaj mamy ' + 
convert(nvarchar(MAX), GETDATE(), 20)

też wartości zwracane prawidłowo.

Dlaczego więc nie działa tu:
	select * from @TaBelKa

Znaczy: widzę, że zgłasza niezgodność zmiennej. Ale dlaczego?

Jeśli tabela ma kilka kolumn, to nie ma problemu - można deklarować. Ale 
jeśli tabel jest ok. 300, a w niektórych po kilkadziesiąt i więcej 
kolumn, to zaczyna się problem.


> a drugi to jakaś skomplikowana kopia
> z jakiegoś pszykładu, gdzie nie wszystko jest niezbędne.

O czym Ty piszesz? Jaka kopia? Z palca pisałem.
Możesz powiedzieć, co jest niepotrzebne? Chętnie się dowiem, bo o to mi 
chodzi.

Sprawdzałem na MS-SQL od 2005 do 2016. Starszych nie sprawdzałem, już 
raczej nie ma potrzeby.


Teraz - dlaczego pytam.

Otóż, konstruując większe zapytania i korzystając z konstrukcji
SET @SQL = N'
to w edytorze Management Studio wszystko po znaku ['] już nie jest 
kontrolowane względem składni.
Rodzi to możliwość popełnienia błędów choćby literowych, a znaleźć taki 
w większych zapytaniach to problem.

Poniżej przykład jednego z zapytań, niezbyt zresztą długiego:

=============================================

DECLARE @DATA12 datetime;
set @DATA12 = '20120101';


SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

--Wyliczanie poziomów grup produktów
WITH g(gid, gidTyp, kod, gidNumer, grONumer, poziom, sciezka)
AS
(
       SELECT TwG_TwGID, TwG_GIDTyp, TwG_Kod, TwG_GIDNumer, 
TwG_GrONumer, 0 as poziom, convert(nvarchar(1024), '') as sciezka
       FROM CDN.TwrGrupy
       WHERE TwG_TwGID = 0

       UNION ALL

       SELECT TwG_TwGID, TwG_GIDTyp, TwG_Kod, TwG_GIDNumer, 
TwG_GrONumer, p.poziom + 1 as poziom, convert(nvarchar(1024), p.sciezka 
+ N'\' + c.TwG_Kod) as sciezka
       FROM g p
       JOIN CDN.TwrGrupy c
       ON c.TwG_GrONumer = p.gidNumer
       WHERE c.TwG_TwGID <> 0 AND c.TwG_GIDTyp = -16
)

SELECT * INTO #tmpTwrGr FROM g

DECLARE @poziom int
DECLARE @poziom_max int
DECLARE @sql nvarchar(max)
SELECT @poziom_max = MAX(poziom) FROM #tmpTwrGr
SET @poziom = @poziom_max
SET @sql = N''

WHILE @poziom >= 0
BEGIN
	SET @sql = N'ALTER TABLE #tmpTwrGr ADD Poziom' + CAST(@poziom AS 
nvarchar) + N' nvarchar(40), ONr' + CAST(@poziom AS nvarchar) + N' 
nvarchar(40)'
     EXEC(@sql)

     IF @poziom = @poziom_max
		BEGIN
			SET @sql = N'UPDATE #tmpTwrGr
				SET ONr' + CAST(@poziom AS nvarchar) +  '= grONumer '
			EXEC(@sql)
			
			SET @sql = N'UPDATE #tmpTwrGr
				SET Poziom' + CAST(@poziom AS nvarchar) + ' = kod'
			EXEC(@sql)
		END
     ELSE
		BEGIN
     		SET @sql = N'UPDATE c
				SET c.Poziom' + CAST(@poziom AS nvarchar) + N' = (
					CASE WHEN c.poziom <=' + CAST(@poziom AS nvarchar) + N' THEN 
CAST(c.kod AS nvarchar)
					ELSE CAST(p.kod AS nvarchar) END)
				FROM #tmpTwrGr c
				LEFT JOIN #tmpTwrGr p
				ON c.ONr' + CAST(@poziom + 1 AS nvarchar) + '= p.gidNumer '
			EXEC(@sql)
	
			SET @sql = N'UPDATE c
				SET c.ONr' + CAST(@poziom AS nvarchar) + N' = (
					CASE WHEN c.poziom <=' + CAST(@poziom AS nvarchar) + N' THEN 
CAST(c.grONumer AS nvarchar)
					ELSE CAST(p.grONumer AS nvarchar) END)
				FROM #tmpTwrGr c
				LEFT JOIN #tmpTwrGr p
				ON c.ONr' + CAST(@poziom + 1 AS nvarchar) + '= p.gidNumer '
				EXEC(@sql)
		END
     SET @poziom = @poziom - 1
END

declare @select varchar(max)
declare @kolumny varchar(max)
declare @kolumny2 varchar(max)
declare @i int

set @kolumny = ''
set @kolumny2 = ''
set @i=0
while (@i<=@poziom_max)
begin
	set @kolumny = @kolumny + ',"Produkt Grupa Poziom ' + LTRIM(@i) + '" = 
CASE WHEN Poz.Poziom' +LTRIM(@i) + ' IS NULL THEN ''(NIEPRZYPISANE)'' 
ELSE Poz.Poziom' + LTRIM(@i) + ' END'
	set @kolumny2 = @kolumny2 + ',Poz.Poziom' +LTRIM(@i)
	set @i = @i + 1
end

--W³aœciwe zapytanie
set @select =
'SELECT
	DB_NAME() [Baza Firmowa],
	
	MAX(Twr_Kod) [Produkt Kod],
	25003 [Produkt Kod __PROCID__Towary__], Twr_twrId [Produkt Kod __ORGID__],	
	
	MAX(Twr_Nazwa) [Produkt Nazwa],
	25003 [Produkt Nazwa __PROCID__], Twr_twrId [Produkt Nazwa __ORGID__],
	
	MAX(CASE
		WHEN Twr_Typ = 0 AND Twr_Produkt = 0 THEN ''Us³uga Prosta''
		WHEN Twr_Typ = 1 AND Twr_Produkt = 0 THEN ''Towar Prosty''
		WHEN Twr_Typ = 0 AND Twr_Produkt = 1 THEN ''Us³uga Z³o¿ona''
		WHEN Twr_Typ = 1 AND Twr_Produkt = 1 THEN ''Towar Z³o¿ony''
		ELSE ''(NIEOKREŒLONY)''
	END) [Produkt Typ],
	ISNULL(MAX(Kat_KodOgolny),''(NIEOKREŚLONA)'')  [Produkt Kategoria 
Ogólna], ISNULL(MAX(Kat_KodSzczegol),''(NIEOKREŚLONA)'') [Produkt 
Kategoria Szczegółowa], MAX(Twr_JM) [Jednostka Miary],
	"Ilość Stan Początkowy H"=0, "Ilość Stan Początkowy M"=0,
	"Ilość FZ"=SUM(IsNull(TrE_Ilosc,0)*CASE WHEN TrE_TypDokumentu=301 THEN 
1 ELSE 0 END),
	"Ilość FS"=SUM(IsNull(TrE_Ilosc,0)*CASE WHEN TrE_TypDokumentu=302 THEN 
1 ELSE 0 END),
	"Ilość PA"=SUM(IsNull(TrE_Ilosc,0)*CASE WHEN TrE_TypDokumentu=305 THEN 
1 ELSE 0 END),
	"Ilość PZ"=SUM( IsNull(TrE_Ilosc,0)*CASE WHEN TrE_TypDokumentu=307 THEN 
1 ELSE 0 END),
	"Ilość PKA"=SUM( IsNull(TrE_Ilosc,0)*CASE WHEN TrE_TypDokumentu=313 
THEN 1 ELSE 0 END),
	"Ilość PW"=SUM( IsNull(TrE_Ilosc,0)*CASE WHEN TrE_TypDokumentu IN 
(310,303,317) THEN 1 ELSE 0 END),
	"Ilość MM OL"= SUM( IsNull(TrE_Ilosc,0)*CASE WHEN TrE_TypDokumentu = 
312 AND TrN_Rodzaj = 312010 THEN 1 ELSE 0 END),
	"Ilość WZ"=SUM( IsNull(TrE_Ilosc,0)*CASE WHEN TrE_TypDokumentu=306 THEN 
1 ELSE 0 END),
	"Ilość WKA"=SUM( IsNull(TrE_Ilosc,0)*CASE WHEN TrE_TypDokumentu=314 
THEN 1 ELSE 0 END),
	"Ilość RW"=SUM( IsNull(TrE_Ilosc,0)*CASE WHEN TrE_TypDokumentu IN 
(304,318) THEN 1 ELSE 0 END),
	"Ilość MM LO"= SUM( IsNull(TrE_Ilosc,0)*CASE WHEN TrE_TypDokumentu = 
312 AND TrN_Rodzaj = 312100 THEN 1 ELSE 0 END),
	"Wartość Stan Początkowy H"=0, "Wartość Stan Początkowy M"=0,
	"Wartość FZ"=SUM(IsNull(TrE_WartoscNetto,0)*CASE WHEN 
TrE_TypDokumentu=301 THEN 1 ELSE 0 END),
	"Wartość FS"=SUM(IsNull(TrE_WartoscNetto,0)*CASE WHEN 
TrE_TypDokumentu=302 THEN 1 ELSE 0 END),
	"Wartość PA"=SUM(IsNull(TrE_WartoscNetto,0)*CASE WHEN 
TrE_TypDokumentu=305 THEN 1 ELSE 0 END),
	"Wartość PZ"=SUM( IsNull(TrE_WartoscNetto,0)*CASE WHEN 
TrE_TypDokumentu=307 THEN 1 ELSE 0 END),
	"Wartość PKA"=SUM( IsNull(TrE_WartoscNetto,0)*CASE WHEN 
TrE_TypDokumentu=313 THEN 1 ELSE 0 END),
	"Wartość PW"=SUM( IsNull(TrE_WartoscNetto,0)*CASE WHEN TrE_TypDokumentu 
IN (310,303,317) THEN 1 ELSE 0 END),
	"Wartość MM OL"= SUM( IsNull(TrE_WartoscNetto,0)*CASE WHEN 
TrE_TypDokumentu = 312 AND TrN_Rodzaj = 312010 THEN 1 ELSE 0 END),
	"Wartość WZ"=SUM( IsNull(TrE_WartoscNetto,0)*CASE WHEN 
TrE_TypDokumentu=306 THEN 1 ELSE 0 END),
	"Wartość WKA"=SUM( IsNull(TrE_WartoscNetto,0)*CASE WHEN 
TrE_TypDokumentu=314 THEN 1 ELSE 0 END),
	"Wartość RW"=SUM( IsNull(TrE_WartoscNetto,0)*CASE WHEN TrE_TypDokumentu 
IN (304,318) THEN 1 ELSE 0 END),
	"Wartość MM LO"= SUM( IsNull(TrE_WartoscNetto,0)*CASE WHEN 
TrE_TypDokumentu = 312 AND TrN_Rodzaj = 312100 THEN 1 ELSE 0 END),
	"Ilość Stan Obecny"= (select sum(CDN.TwrZasoby.TwZ_Ilosc) from 
cdn.TwrZasoby where CDN.Towary.Twr_TwrId = CDN.TwrZasoby.TwZ_TwrId),
"Ilość 2012"=(select twi_ilosc from cdn.TwrIlosci
		where TwI_TwrId =CDN.Towary.Twr_TwrId and TwI_MagId = 1
		and twi_data=(select top 1 TwI_Data from cdn.TwrIlosci where TwI_TwrId 
= CDN.Towary.Twr_TwrId and TwI_MagId = 1 and  twi_data 
<=CONVERT(DATETIME,''' + CONVERT(VARCHAR,@DATA12,120) + ''',120) order 
by twi_Data desc)),


	"Ilość Stan Start"=(select twi_ilosc from cdn.TwrIlosci
		where TwI_TwrId =CDN.Towary.Twr_TwrId and TwI_MagId = 1
		and twi_data=(select top 1 TwI_Data from cdn.TwrIlosci where TwI_TwrId 
= CDN.Towary.Twr_TwrId and TwI_MagId = 1 and  twi_data 
<=CONVERT(DATETIME,''' + CONVERT(VARCHAR,@DATAOD,120) + ''',120) order 
by twi_Data desc)),
	"Ilość Stan Stop"=(select twi_ilosc from cdn.TwrIlosci
		where TwI_TwrId =CDN.Towary.Twr_TwrId and TwI_MagId = 1
		and twi_data=(select top 1 TwI_Data from cdn.TwrIlosci where TwI_TwrId 
= CDN.Towary.Twr_TwrId and TwI_MagId = 1 and  twi_data 
<=CONVERT(DATETIME,''' + CONVERT(VARCHAR,@DATADO,120) + ''',120) order 
by twi_Data desc))
' + @kolumny +
' FROM CDN.Towary
	LEFT OUTER JOIN cdn.TraElem ON TrE_TwrID=Twr_TwrID
	LEFT OUTER JOIN cdn.TraNag  ON TrN_TrNID=TrE_TrNID
	LEFT OUTER JOIN cdn.Magazyny ON Mag_MagID=TrN_MagZrdID
	LEFT OUTER JOIN cdn.Kategorie ON Kat_KatID=Twr_KatID
	LEFT JOIN #tmpTwrGr Poz ON Twr_TwGGIDNumer = Poz.gidNumer
WHERE (TrN_Bufor<>-1  AND TrN_Korekta IN (0,1) OR TrN_TrNID IS NULL)
	AND (((TrE_TypDokumentu IN (302,304,305,306,314,318) OR TrN_Rodzaj IN 
(312100)
	OR ((TrE_TypDokumentu IN (301,310,303,307,313,317) OR TrN_Rodzaj IN 
(312010)) AND TrN_Bufor=0))
	AND TrE_Aktywny<>0)	OR TrE_TrEID IS NULL)
	AND (TrN_DataOpe BETWEEN CONVERT(DATETIME,''' + 
CONVERT(VARCHAR,@DATAOD,120) + ''',120) AND CONVERT(DATETIME,''' + 
CONVERT(VARCHAR,@DATADO,120) + ''',120) OR TrE_TrEID IS NULL)
GROUP BY Twr_TwrID ' + @kolumny2 + '

UNION ALL

SELECT
	DB_NAME() [Baza Firmowa],
	
	MAX(Twr_Kod) [Produkt Kod],
	25003 [Produkt Kod __PROCID__Towary__], Twr_twrId [Produkt Kod __ORGID__],	
	
	MAX(Twr_Nazwa) [Produkt Nazwa],
	25003 [Produkt Nazwa __PROCID__], Twr_twrId [Produkt Nazwa __ORGID__],	

	MAX(CASE
		WHEN Twr_Typ = 0 AND Twr_Produkt = 0 THEN ''Us³uga Prosta''
		WHEN Twr_Typ = 1 AND Twr_Produkt = 0 THEN ''Towar Prosty''
		WHEN Twr_Typ = 0 AND Twr_Produkt = 1 THEN ''Us³uga Z³o¿ona''
		WHEN Twr_Typ = 1 AND Twr_Produkt = 1 THEN ''Towar Z³o¿ony''
		ELSE ''(NIEOKREŒLONY)''
	END) [Produkt Typ],
	ISNULL(MAX(Kat_KodOgolny),''(NIEOKREŚLONA)'') [Produkt Kategoria 
Ogólna], ISNULL(MAX(Kat_KodSzczegol),''(NIEOKREŚLONA)'')  [Produkt 
Kategoria Szczegółowa], MAX(Twr_JM) [Jednostka Miary],
	"Ilość Stan Początkowy H"=SUM(IsNull(TrE_Ilosc,0)*CASE WHEN 
TrE_TypDokumentu=301 THEN 1 WHEN TrE_TypDokumentu IN (302,305) THEN -1 
ELSE 0 END),
	"Ilość Stan Początkowy M"=SUM(IsNull(TrE_Ilosc,0)*CASE WHEN 
TrE_TypDokumentu IN (310,303,307,313,317) THEN 1 WHEN TrE_TypDokumentu 
IN (301,302,305) THEN 0 ELSE -1 END),
	"Ilość FZ"=0, "Ilość FS"=0,	"Ilość PA"=0, "Ilość PZ"=0,	"Ilość PKA"=0, 
"Ilość PW"=0, "Ilość MM OL"=0, "Ilość WZ"=0,	"Ilość WKA"=0, "Ilość 
RW"=0, "Ilość MM LO"=0,
	"Wartość Stan Początkowy H"=SUM(IsNull(TrE_WartoscNetto,0)*CASE WHEN 
TrE_TypDokumentu=301 THEN 1 WHEN TrE_TypDokumentu IN (302,305) THEN -1 
ELSE 0 END),
	"Wartość Stan Początkowy M"=SUM(IsNull(TrE_WartoscNetto,0)*CASE WHEN 
TrE_TypDokumentu IN (310,303,307,313,317) THEN 1 WHEN TrE_TypDokumentu 
IN (301,302,305) THEN 0 ELSE -1 END),
	"Wartość FZ"=0, "Wartość FS"=0,	"Wartość PA"=0, "Wartość PZ"=0, 
"Wartość PKA"=0, "Wartość PW"=0, "Wartość MM OL"=0,	"Wartość WZ"=0, 
"Wartość WKA"=0, "Wartość RW"=0, "Wartość MM LO"=0,
	"Ilość Stan Obecny"=0,
	"Ilość 2012"=0,
	"Ilość Stan Start"=0,
	"Ilość Stan Stop"=0
' + @kolumny +
' FROM CDN.Towary
	LEFT OUTER JOIN cdn.TraElem ON TrE_TwrID=Twr_TwrID
	LEFT OUTER JOIN cdn.TraNag  ON TrN_TrNID=TrE_TrNID
	LEFT OUTER JOIN cdn.Magazyny ON Mag_MagID=TrN_MagZrdID
	LEFT OUTER JOIN cdn.Kategorie ON Kat_KatID=Twr_KatID
	LEFT JOIN #tmpTwrGr Poz ON Twr_TwGGIDNumer = Poz.gidNumer
WHERE (TrN_Bufor<>-1  AND TrN_Korekta IN (0,1) OR TrN_TrNID IS NULL)
	AND (((TrE_TypDokumentu IN (302,304,305,306,314,318) OR TrN_Rodzaj IN 
(312100)
	OR ((TrE_TypDokumentu IN (301,310,303,307,313,317) OR TrN_Rodzaj IN 
(312010)) AND TrN_Bufor=0))
	AND TrE_Aktywny<>0)	OR TrE_TrEID IS NULL)
	AND (TrN_DataOpe < CONVERT(DATETIME,''' + CONVERT(VARCHAR,@DATAOD, 120) 
+ ''',120) OR TrE_TrEID IS NULL)
GROUP BY Twr_TwrID' + @kolumny2

exec (@select)

DROP TABLE #tmpTwrGr

=============================================


-- 
Pozdrawiam.

Adam
Re: Dziwne zmienne w MS-SQL
#195609
Author: Stokrotka
Date: Sat, 16 Jun 2018 14:14
14 lines
1441 bytes
> Dlaczego więc nie działa tu:
> select * from @TaBelKa
>
> Znaczy: widzę, że zgłasza niezgodność zmiennej. Ale dlaczego?
>
Brakuje ci podstaw.
Select jest do tabel,
a twoja zmienna to nie tabela.

-- 
(tekst bez: ó, ch, rz i -ii)
Ortografia to NAWYK, często nielogiczny, ktury ludzie ociężali umysłowo,
nażucają bezmyślnie następnym pokoleniom. ( ortografia . pev . pl ) 
Re: Dziwne zmienne w MS-SQL
#195614
Author: wloochacz
Date: Sat, 16 Jun 2018 18:20
48 lines
2756 bytes
W dniu 2018-06-15 o 15:29, Adam pisze:
> Witajcie.
> 
> Dlaczego zmienne w pewnych sytuacjach nie działają jak zmienne?
> 
> Przykład _NIE_ działający:
Ten kod nie jest poprawny dla MSSQL to i nie działa...

> use master
> 
> declare @TaBelKa nvarchar(40)
> set @TaBelKa = 'sys.tables'
> select * from @TaBelKa
> 
> Zmienna niby jest "napompowana" wartością, gdyż select @TaBelKa  zwraca 
> wartość prawidłową.
I tak powinieneś tego używać; select @zmienna, a nie
select * from @zmienna
jeśli to nie jest zmienna tabelaryczna.

> Dlaczego trzeba tworzyć jakieś karkołomne konstrukcje typu:
> 
> use master
> 
> declare @TaBelKa nvarchar(40)
> set @TaBelKa = 'sys.tables'
> DECLARE @SQL NVARCHAR(100)
> SET @SQL = N'SELECT * FROM ' + @TaBelKa
> EXECUTE sp_executesql @SQL
Dlatego, że nazwy tabel i kolumn muszą być statyczne, jeśli zapytanie 
jest statyczne - a jest w tym przypadku.
W przypadku dynamicznych nazw tabel lub kolumn należy przekazać cały SQL 
w sposób dynamiczny i użyć sp_executesql do jego wykonania.

Powiedz lepiej co chcesz zrobić.
Jeśli chcesz wykonać select z tabeli, którą podasz ze zmiennej - to tak, 
właśnie tak to należy zrobić po stronie serwera.

Ale może lepiej ów string do wykonania przygotować w aplikacji?

> Ki diabeł?
> O co chodzi?
Takie zasady.
A dodatkowo doczytaj sobie o zmiennych tabelarycznych i skalarnych.
Co prawda, to nie na temat Twojego pytania, ale... warto wiedzieć ;-)

-- 
wloochacz
Re: Dziwne zmienne w MS-SQL
#195610
Author: Adam
Date: Sat, 16 Jun 2018 18:29
24 lines
1658 bytes
W dniu 2018-06-16 o 16:14, Stokrotka pisze:
> 
>> Dlaczego więc nie działa tu:
>> select * from @TaBelKa
>>
>> Znaczy: widzę, że zgłasza niezgodność zmiennej. Ale dlaczego?
>>
> Brakuje ci podstaw.
> Select jest do tabel,
> a twoja zmienna to nie tabela.
> 

Select jest używany nie tylko do tabel.
Zmienna tablicowa z T-SQL to co innego, niż tabela.

Przykłady masz chyba we fragmencie raportu, który podałem wcześniej. 
Raport pisałem jeszcze pod SQL2000, ale chyba raczej optymalizacji pod 
nowsze wersje nie wymaga - może poza OPTION(RECOMPILE).


-- 
Pozdrawiam.

Adam
Re: Dziwne zmienne w MS-SQL
#195615
Author: Adam
Date: Sat, 16 Jun 2018 18:43
48 lines
2806 bytes
W dniu 2018-06-16 o 20:20, wloochacz pisze:
> W dniu 2018-06-15 o 15:29, Adam pisze:
>> (...)
>> declare @TaBelKa nvarchar(40)
>> set @TaBelKa = 'sys.tables'
>> DECLARE @SQL NVARCHAR(100)
>> SET @SQL = N'SELECT * FROM ' + @TaBelKa
>> EXECUTE sp_executesql @SQL
> Dlatego, że nazwy tabel i kolumn muszą być statyczne, jeśli zapytanie 
> jest statyczne - a jest w tym przypadku.
> W przypadku dynamicznych nazw tabel lub kolumn należy przekazać cały SQL 
> w sposób dynamiczny i użyć sp_executesql do jego wykonania.
> 
> Powiedz lepiej co chcesz zrobić.

Czy widzisz moją pierwszą odpowiedź dla Kwiatuszka?
Zacytuję fragment:

Otóż, konstruując większe zapytania i korzystając z konstrukcji
SET @SQL = N'
to w edytorze Management Studio wszystko po znaku ['] już nie jest 
kontrolowane względem składni.
Rodzi to możliwość popełnienia błędów choćby literowych, a znaleźć taki 
w większych zapytaniach to problem.

> Jeśli chcesz wykonać select z tabeli, którą podasz ze zmiennej - to tak, 
> właśnie tak to należy zrobić po stronie serwera.
> 
> Ale może lepiej ów string do wykonania przygotować w aplikacji?
> 
>> Ki diabeł?
>> O co chodzi?
> Takie zasady.
> A dodatkowo doczytaj sobie o zmiennych tabelarycznych i skalarnych.
> Co prawda, to nie na temat Twojego pytania, ale... warto wiedzieć ;-)

Jak być może pamiętasz, od czasu do czasu coś tam dorabiam do programów, 
o których kiedyś rozmawialiśmy. Istotnie, czasem brakuje mi wiedzy.
Nie pamiętam teraz konkretnego przykładu, ale w dużych konstrukcjach z 
zagnieżdżonymi selectami i z użyciem LEFT JOIN oraz masą warunków 
zauważyłem, że jeżeli do WHERE ... doda się AND 1=1 (co wydaje się 
bezsensem), to zapytanie wykonuje się szybciej.


-- 
Pozdrawiam.

Adam
Re: Dziwne zmienne w MS-SQL
#195616
Author: Stokrotka
Date: Sun, 17 Jun 2018 11:54
15 lines
1687 bytes
> to w edytorze Management Studio wszystko po znaku ['] już nie jest
> kontrolowane względem składni.
> Rodzi to możliwość popełnienia błędów choćby literowych, a znaleźć taki w 
> większych zapytaniach to problem.

A czy pszypadkiem apostrof nie oznacza początku komentaża do końca lini itp.
Edytory często tak mają i słusznie, więc nie krytykuj.
I od razu widać, że nie komentujesz programu,
a to podstawowy obowiązek programisty.

-- 
(tekst bez: ó, ch, rz i -ii)
Ortografia to NAWYK, często nielogiczny, ktury ludzie ociężali umysłowo,
nażucają bezmyślnie następnym pokoleniom. ( ortografia . pev . pl ) 
Re: Dziwne zmienne w MS-SQL
#195617
Author: Adam
Date: Sun, 17 Jun 2018 13:50
23 lines
1747 bytes
W dniu 2018-06-17 o 13:54, Stokrotka pisze:
> 
>> to w edytorze Management Studio wszystko po znaku ['] już nie jest
>> kontrolowane względem składni.
>> Rodzi to możliwość popełnienia błędów choćby literowych, a znaleźć 
>> taki w większych zapytaniach to problem.
> 
> A czy pszypadkiem apostrof nie oznacza początku komentaża do końca lini 
> itp.
> Edytory często tak mają i słusznie, więc nie krytykuj.
> I od razu widać, że nie komentujesz programu,
> a to podstawowy obowiązek programisty.
> 

Po raz kolejny: nie wiesz, o czym mówisz.
Może już się nie odzywaj, bo nie da się czytać Twoich tekstów bez bólu 
głowy.


-- 
Pozdrawiam.

Adam
Re: Dziwne zmienne w MS-SQL
#195618
Author: Stokrotka
Date: Sun, 17 Jun 2018 16:49
31 lines
2560 bytes

>>> to w edytorze Management Studio wszystko po znaku ['] już nie jest
>>> kontrolowane względem składni.
>>> Rodzi to możliwość popełnienia błędów choćby literowych, a znaleźć taki 
>>> w większych zapytaniach to problem.
>>
>> A czy pszypadkiem apostrof nie oznacza początku komentaża do końca lini 
>> itp.
>> Edytory często tak mają i słusznie, więc nie krytykuj.
>> I od razu widać, że nie komentujesz programu,
>> a to podstawowy obowiązek programisty.
>>
>
> Po raz kolejny: nie wiesz, o czym mówisz.
> Może już się nie odzywaj, bo nie da się czytać Twoich tekstów bez bólu 
> głowy.

Odzywając się robisz z siebie idiotę.
Brak ci wiedzy uczonej w ciągu pierwszeo semestru na informatyce, mimo, że 
było to tylko około 4 h lekcyjnyh na tydzień.

I niemiej do mnie żalu, ale mnie denerwują samce
potrafiący właczyć kompa do sieci,
i z tego powodu każącymi nazywać się informatykami.


-- 
(tekst bez: ó, ch, rz i -ii)
Ortografia to NAWYK, często nielogiczny, ktury ludzie ociężali umysłowo,
nażucają bezmyślnie następnym pokoleniom. ( ortografia . pev . pl ) 
Re: Dziwne zmienne w MS-SQL
#195611
Author: ydziO
Date: Sun, 17 Jun 2018 19:06
15 lines
1282 bytes
On 2018-06-16 10:45:46 +0000, Adam said:

> Dlaczego więc nie działa tu:
> 	select * from @TaBelKa

Kiedyś chciałem zrobić coś podobnego.
Masz błąd ponieważ dla Management Studio zmienna musi być tabelą, bo ze 
zmiennej chcesz zrobic select.

Musisz zrobić tak:

EXEC('SELECT * FROM ' + @TaBelKa)

A opisane masz to tutaj:
https://stackoverflow.com/questions/2838490/table-name-as-variable
Re: Dziwne zmienne w MS-SQL
#195612
Author: Adam
Date: Mon, 18 Jun 2018 10:21
41 lines
2407 bytes
W dniu 2018-06-17 o 21:06, ydziO pisze:
> On 2018-06-16 10:45:46 +0000, Adam said:
> 
>> Dlaczego więc nie działa tu:
>>     select * from @TaBelKa
> 
> Kiedyś chciałem zrobić coś podobnego.
> Masz błąd ponieważ dla Management Studio zmienna musi być tabelą, bo ze 
> zmiennej chcesz zrobic select.
> 
> Musisz zrobić tak:
> 
> EXEC('SELECT * FROM ' + @TaBelKa)
> 
> A opisane masz to tutaj:
> https://stackoverflow.com/questions/2838490/table-name-as-variable
> 

To ja wiem, dzięki za linka.
Tylko wydawało mi się, że nazwa tabeli jest stringiem, i powinna 
"działać" jak string, czyli dawać się wołać ze zmiennej typu string.

Tak, jak pisałem wcześniej - przy większych zapytaniach, można się 
pomylić, gdyż w MS brak jest kontroli poprawności, a zapytanie wołane 
przez EXEC jest traktowane jako string.

Co prawda raz tylko miałem taki problem - klient zauważył, że w pewnych 
specyficznych sytuacjach raport źle mu się liczy. A szukanie czegoś w 
czyimś dość zagmatwanym kodzie nie jest proste, zwłaszcza, że zmiennych 
było multum o nie znaczących ale podobnych nazwach. Listing zaś miał 
kilkanaście stron.

Ech, ograniczenia MS-SQL :(
Czasami mam wrażenie, że sporo rzeczy nie można zrobić w SQL spośród 
tego, co było w Dbase.


-- 
Pozdrawiam.

Adam
Re: Dziwne zmienne w MS-SQL
#195613
Author: ydziO
Date: Mon, 18 Jun 2018 16:10
34 lines
2301 bytes
On 2018-06-18 10:21:34 +0000, Adam said:

> W dniu 2018-06-17 o 21:06, ydziO pisze:
>> On 2018-06-16 10:45:46 +0000, Adam said:
>> 
>>> Dlaczego więc nie działa tu:
>>>     select * from @TaBelKa
>> 
>> Kiedyś chciałem zrobić coś podobnego.
>> Masz błąd ponieważ dla Management Studio zmienna musi być tabelą, bo ze 
>> zmiennej chcesz zrobic select.
>> 
>> Musisz zrobić tak:
>> 
>> EXEC('SELECT * FROM ' + @TaBelKa)
>> 
>> A opisane masz to tutaj:
>> https://stackoverflow.com/questions/2838490/table-name-as-variable
>> 
> 
> To ja wiem, dzięki za linka.
> Tylko wydawało mi się, że nazwa tabeli jest stringiem, i powinna 
> "działać" jak string, czyli dawać się wołać ze zmiennej typu string.
> 

Też tak kiedyś myślałem. I co ja się nakonwertowałem na różne sposoby 
żeby działało. Bo to przecież zmienna typu string. Ale później 
skojarzyłem, że jak ma "from", to potrzebuje obiektu typu tabela po 
prawej stronie. A skoro mamy łańcuch znaków, to z tego nic nie 
wydobędzie.
Z kolei ja nie wiedziałem, że przy "EXEC" można zrobić w taki sposób 
jak w tym linku. Do tamtego czasu myślałem, że używa się głównie przy 
procedurach składowanych. Na szczęście podróże po internaetach 
kształcą. I pewnie jeszcze wiele wędrówek mnie czeka.
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads