Это мой первый пост в stackoverflow, я надеюсь, что один из многих!
Мой вопрос таков: я использую CTE в запросе для обнаружения и удаления повторяющихся записей в таблице. Этот запрос отлично работает в SQL Server 2005/2008, но в Compact он генерирует исключение:
Произошла ошибка при анализе запроса. [Номер линии токена = 1, линия токена offset = 1, токен с ошибкой = WITH]
Это мой запрос:
SqlCeConnection con = new SqlCeConnection(ConfigurationManager.ConnectionStrings["ADSLConnectionString"].ConnectionString);
SqlCeCommand command = new SqlCeCommand();
command.Connection = con;
command.CommandType = CommandType.Text;
command.CommandText = "WITH Dublicates_CTE(Username, accountid)" +
" AS" +
" (" +
" SELECT UserName,min(accountid)" +
" FROM Accounts" +
" GROUP BY username" +
" HAVING Count(*) > 1" +
" )" +
" DELETE FROM Accounts" +
" WHERE accountid IN (" +
" SELECT Accounts.accountid" +
" FROM Accounts" +
" INNER JOIN Dublicates_CTE" +
" ON Accounts.Username = Dublicates_CTE.Username" +
" AND Accounts.accountid <> Dublicates_CTE.accountid" +
" ) ";
con.Open();
command.ExecuteNonQuery();
Мне что-то не хватает, или CTE не работает на SQL Server Compact?
Вероятно, вы можете просто вложить запрос, что-то вроде этого (могут иметь некоторые проблемы с синтаксисом):
DELETE FROM Accounts
WHERE accountid IN (
SELECT Accounts.accountid
FROM Accounts
INNER JOIN (
SELECT UserName,min(accountid) accountid
FROM Accounts
GROUP BY username
HAVING Count(*) > 1
) Dublicates_CTE
ON Accounts.Username = Dublicates_CTE.Username
AND Accounts.accountid <> Dublicates_CTE.accountid
)
Некоторые доказательства того, может ли SQL Compact 3.5 TSQL подмножество использовать общие выражения таблицы:
Протестировано с Visual Studio 2010 и новым файлом SQL Compact.sdf.
В будущем это хорошая ссылка Различия между SQL Server Compact и SQL Server
некоторые вещи не поддерживаются мобильной версией CTE, а хранение procs, например, не будет работать в мобильной версии. Вы можете использовать экспресс-версию, которая также бесплатна.