Ostatnio 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.
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ł
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.
Tak na prawdę to używanie kolumn text jeśli nie jest konieczne nie jest polecane, szczególnie dla takich pól jak imię czy nazwisko (raczej nie spodziewasz się ich dłuższych niż powiedzmy 20-30 znaków).
Dodatkowo:
http://msdn.microsoft.com/en-us/library/ms187993.aspx
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.
Pingback: dotnetomaniak.pl
Do projektów „na chwilę”, które będą przeniesione na dużego SQLa lepiej użyć SQL Express, tu różnice są subtelne.
Ale SQL Express wymaga instalacji z CE nie 🙂
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!
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