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
Author: Adam
Date: Fri, 15 Jun 2018 13:29
Date: Fri, 15 Jun 2018 13:29
36 lines
1479 bytes
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
Author: Stokrotka
Date: Fri, 15 Jun 2018 16:03
Date: Fri, 15 Jun 2018 16:03
39 lines
1958 bytes
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
Author: Adam
Date: Sat, 16 Jun 2018 10:45
Date: Sat, 16 Jun 2018 10:45
362 lines
14062 bytes
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
Author: Stokrotka
Date: Sat, 16 Jun 2018 14:14
Date: Sat, 16 Jun 2018 14:14
14 lines
1441 bytes
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
Author: wloochacz
Date: Sat, 16 Jun 2018 18:20
Date: Sat, 16 Jun 2018 18:20
48 lines
2756 bytes
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
Author: Adam
Date: Sat, 16 Jun 2018 18:29
Date: Sat, 16 Jun 2018 18:29
24 lines
1658 bytes
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
Author: Adam
Date: Sat, 16 Jun 2018 18:43
Date: Sat, 16 Jun 2018 18:43
48 lines
2806 bytes
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
Author: Stokrotka
Date: Sun, 17 Jun 2018 11:54
Date: Sun, 17 Jun 2018 11:54
15 lines
1687 bytes
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
Author: Adam
Date: Sun, 17 Jun 2018 13:50
Date: Sun, 17 Jun 2018 13:50
23 lines
1747 bytes
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
Author: Stokrotka
Date: Sun, 17 Jun 2018 16:49
Date: Sun, 17 Jun 2018 16:49
31 lines
2560 bytes
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
Author: ydziO
Date: Sun, 17 Jun 2018 19:06
Date: Sun, 17 Jun 2018 19:06
15 lines
1282 bytes
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
Author: Adam
Date: Mon, 18 Jun 2018 10:21
Date: Mon, 18 Jun 2018 10:21
41 lines
2407 bytes
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
Author: ydziO
Date: Mon, 18 Jun 2018 16:10
Date: Mon, 18 Jun 2018 16:10
34 lines
2301 bytes
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