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.