Amikor pár sornyi beépített adattal kell dolgozni, jól jön, hogy van tábla típusú változó:
DECLARE @Movie TABLE ( MovieID INT IDENTITY(1, 1), MovieRatingId INT, Title VARCHAR(200) NOT NULL );
Az adatok betöltése azonban egy utasításban kicsit körülményes volt:
INSERT INTO @Movie (MovieRatingId, Title) SELECT 3, 'SQL the Movie' UNION ALL SELECT 4, 'SQL Massacre' UNION ALL SELECT 1, 'SQL for Everyone' UNION ALL SELECT 4, 'SQL Massacre 2 - The Oracle Returns'
De SQL Server 2008-ban létezik a Row Constructor, azzal sokkal tisztább megoldást érhetünk el:
INSERT INTO @Movie (MovieRatingId, Title) VALUES (3, 'SQL the Movie'), (4, 'SQL Massacre'), (1, 'SQL for Everyone'), (4, 'SQL Massacre 2 - The Oracle Returns');
Jó, mi?
Közvetlenül is lehet szelektálni VALUES-zal létrehozott ál-táblából, csak ilyenkor meg kell adni az oszlopok nevét is az AS után, ami érhető követelmény.
SELECT * FROM ( VALUES (3, 'SQL the Movie'), (4, 'SQL Massacre'), (1, 'SQL for Everyone'), (4, 'SQL Massacre 2 - The Oracle Returns')) AS T(id, text)
Mindez persze megy CTE-ben is:
WITH MovieRatings (MovieRatingId, Code, Description, AllowYouthRentalFlag) AS ( SELECT * FROM (VALUES (0, 'UR','Unrated',1), (1, 'G','General Audiences',1), (2, 'PG','Parental Guidance',1), (3, 'PG-13','Parental Guidance for Children Under 13',1), (4, 'R','Restricted, No Children Under 17 without Parent',0)) AS MR(MovieRatingId, Code, Description, AllowYouthRentalFlag) ) SELECT M.Title, MR.Code AS RatingCode, MR.Description AS RatingDescription FROM @Movie AS M INNER JOIN MovieRatings AS MR ON M.MovieRatingId = MR.MovieRatingId;
Ezek után néha már nem is kell tábla típusú változó, elég egy ilyen pszeudo tábla.
Példák innen lopva. Köszönet érte a szerzőnek.
Could you hire me? Contact me if you like what I’ve done in this article and think I can create value for your company with my skills.
LEAVE A COMMENT
2 COMMENTS
Es a hatterben temp tablakkal dolgozik, vagy hogyan oldja meg? Mert syntax-candy -nak persze, jo, csak kerdes, megeri-e? Vegulis nem sokkal problemasabb a tabla valtozok kezelese, cserebe azokbol sokkal konnyebb valamo nagyon bonyi SELECT-et csinalni.
A végrehajtási terv alapján nem használ temp táblát, constant scan-ként látszik. Leginkább szerintem insertben használható, amikor scriptből kell adatokat betölteni.