Pułapki w SQL Server CE

Microsoft SQL Server Compact EditionOstatnio mam okazję robić projekt, do którego używam WebMatrix i bazę Microsoft SQL Server CE (Compact Edition). Docelowo baza ma być przeniesiona do „dużego” SQL’a, a ten CE miał być tylko na chwilę, na początek, na szybko…

Subselect / subquery

SQL Server CE nie obsługuje Subselectów. Nie możemy zrobić takiego zapytania:

SELECT
    c.FirstName,
    c.LastName,
    (SELECT count(o.id) FROM Order o WHERE o.CustomerId = c.Id) AS OrdersCount
FROM
    Customers c

Nie wnikam  w optymalność takiego zapytania, zwracam uwagę, że tego typu konstrukcje po prostu nie będę działać.

Ale! Dozwolone jest użycie podzapytania w klauzuli from.

Typ text i image

Używając WebMatrix, gdy tworzymy tabelę w bazie danych mamy dostępny typ danych text. Na pierwszy rzut oka wygląda jak zwykły typ znakowy, jak np. nvarchar. Coś mnie podkusiło, że dla FirstName i LastName użyłem właśnie text.

Niestety! Później okazało się, że w zapytaniach z group by nie można używać kolumn typu text i image. Więc poniższe zapytanie nie będzie działać:

SELECT
    c.CustomerId,
    count(c.CustomerId) AS OrdersCount
FROM
    Order o
GROUP BY
    o.CustomerId

Nie przewidywałem, że z text mogą być problemy, ale faktycznie na MSDN możemy przeczytać, że to nie zadziała: Columns of type ntext and image cannot be used in group_by_expression.

9 thoughts on “Pułapki w SQL Server CE

  1. Brak możliwości grupowania po text i image nie jest czymś wyjątkowym jeśli chodzi o SQL CE. Nie można tego robić także w dużej wersji SQLa.

    Paweł

  2. Dzięki za info. Nie jestem SQL guru.
    A w pułapkę wpadłem chyba dlatego, że robiąc jakieś tutoriale z WebMatrixa, ktoś usilnie stosował typ text i nieświadomie, z automatu też użyłem 🙂 No ale uczymy się na błędach.

  3. Również nie można sortować po tym typie. Dodatkowo nie można filtrować wykorzystując operator równości (=) – dozwolone jest tylko LIKE.

    Co ciekawe kiedy chcę przefiltrować kolumnę TEXT z wykorzystaniem operatora równości otrzymuje komunikat: The data types text and varchar are incompatible in the equal to operator.
    Co jest niezupełną prawdą, ponieważ SQL przepuszcza zapytania z filtracją kolumny VARCHAR z operatorem równości.

  4. Pingback: dotnetomaniak.pl

  5. Do projektów „na chwilę”, które będą przeniesione na dużego SQLa lepiej użyć SQL Express, tu różnice są subtelne.

  6. Temat SQL CE zyskał także na popularności wraz z prowadzeniem Windows Phone 7 więc fajnie, że pojawiają się takie artykuły w sieci. Pozdrawiam!

  7. Co do subquery, to problem ten jest także w poprzednich wersjach SQL Compact. Możesz to objeść przepisując subquery na join`a. Dla Twojego przykładu:

    SELECT
    c.FirstName,
    c.LastName,
    COUNT(o.Id) AS OrdersCount
    FROM
    Customers AS c
    INNER JOIN
    Order AS o
    ON
    o.CustomerId = c.Id
    GROUP BY
    c.FirstName,
    c.LastName

Możliwość komentowania jest wyłączona.