Soci (Soczó Zsolt) szakmai blogja

2008.02.14.

SQL Server 2008 újdonságok 21. – Row constructor

Filed under: Adatbázisok,SQL Server 2008 — Soczó Zsolt @ 23:47

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.

2 Comments

  1. 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.

    Comment by hrongyorgy — 2008.02.15. @ 08:08

  2. 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.

    Comment by Soczó Zsolt — 2008.02.16. @ 10:16

RSS feed for comments on this post.

Sorry, the comment form is closed at this time.

Powered by WordPress