У меня есть запрос Linq to SQL, который отлично работал с SQL Server 2005, но мне нужно развернуть веб-приложение с SQL Server 2000, и при выполнении этого запроса я получаю его ошибку:
«System.Data.SqlClient.SqlException: префикс столбца 't0' не совпадает с именем таблицы или псевдонимом, используемым в запросе».
У меня есть еще вопросы, но, похоже, с ними проблем нет. Теперь это запрос:
from warningNotices in DBContext_Analyze.FARs
where warningNotices.FAR_Area_ID == filter.WarningAreaID &&
warningNotices.FAR_Seq == filter.WarningSeq &&
warningNotices.FAR_Year == filter.WarningYear
orderby warningNotices.FAR_Seq ascending
select new Search_Result
{
FAR_Area_ID = warningNotices.FAR_Area_ID,
FAR_Seq = warningNotices.FAR_Seq,
FAR_Year = warningNotices.FAR_Year,
DateTime_Entered = (DateTime)warningNotices.DateTime_Entered == null ? DateTime.MaxValue : (DateTime)warningNotices.DateTime_Entered,
Time_Entered = warningNotices.Time_Entered,
OrigDept = warningNotices.OrigDept,
Part_No = warningNotices.Part_No,
DateTime_Analyzed = (DateTime)warningNotices.DateTime_Analyzed == null ? DateTime.MaxValue : (DateTime)warningNotices.DateTime_Analyzed,
Analyzed_By = warningNotices.Analyzed_By,
MDR_Required = (Char)warningNotices.MDR_Required == null ? Char.MinValue : (Char)warningNotices.MDR_Required,
Resp_Dept = (from FARSympt in DBContext_Analyze.FAR_Symptoms
where FARSympt.FAR_Area_ID == warningNotices.FAR_Area_ID &&
FARSympt.FAR_Year == warningNotices.FAR_Year &&
FARSympt.FAR_Seq == warningNotices.FAR_Seq
select new { FARSympt.Resp_Dept}).FirstOrDefault().Resp_Dept,
Sympt_Desc = (from SymptomsCatalog in DBContext_Analyze.Symptoms
where SymptomsCatalog.symptom_ID == filter.Status_ID
select new {
SymptomsCatalog.Sympt_Desc
}).FirstOrDefault().Sympt_Desc,
Status_ID = warningNotices.Status.HasValue ? warningNotices.Status.Value : 0
};
Раньше в подзапросе для поля Resp_Dept было "Distinc", но я удалил его.
Любые идеи? Заранее спасибо за комментарии =)
Это запрос, который я получаю от профилировщика SQL Server:
exec sp_executesql N'SELECT [t0].[FAR_Seq], [t0].[FAR_Year],
(CASE
WHEN ([t0].[DateTime_Entered]) IS NULL THEN @p3
ELSE [t0].[DateTime_Entered]
END) AS [DateTime_Entered], [t0].[Time_Entered], [t0].[OrigDept], [t0].[Part_No],
(CASE
WHEN ([t0].[DateTime_Analyzed]) IS NULL THEN @p4
ELSE [t0].[DateTime_Analyzed]
END) AS [DateTime_Analyzed], [t0].[Analyzed_By],
(CASE
WHEN (UNICODE([t0].[MDR_Required])) IS NULL THEN @p5
ELSE CONVERT(NChar(1),[t0].[MDR_Required])
END) AS [MDR_Required], (
SELECT [t2].[Resp_Dept]
FROM (
**SELECT TOP (1)** [t1].[Resp_Dept]
FROM [dbo].[FAR_Symptoms] AS [t1]
WHERE (UNICODE([t1].[FAR_Area_ID]) = UNICODE([t0].[FAR_Area_ID])) AND ([t1].[FAR_Year] = [t0].[FAR_Year]) AND ([t1].[FAR_Seq]
= [t0].[FAR_Seq])
) AS [t2]
) AS [Resp_Dept], (
SELECT [t4].[Sympt_Desc]
FROM (
**SELECT TOP (1)** [t3].[Sympt_Desc]
FROM [dbo].[Symptoms] AS [t3]
WHERE [t3].[symptom_ID] = @p6
) AS [t4]
) AS [Sympt_Desc], [t0].[FAR_Area_ID],
(CASE
WHEN [t0].[Status] IS NOT NULL THEN [t0].[Status]
ELSE @p7
END) AS [Status_ID]
FROM [dbo].[FARs] AS [t0]
WHERE (UNICODE([t0].[FAR_Area_ID]) = @p0) AND ([t0].[FAR_Seq] = @p1) AND ([t0].[FAR_Year] = @p2)
ORDER BY [t0].[FAR_Seq]',N'@p0 int,@p1 int,@p2 varchar(2),@p3 datetime,@p4 datetime,@p5 nchar(1),@p6 int,@p7
int',@p0=76,@p1=7204,@p2='08',@p3=''9999-12-31 23:59:59:997'',@p4=''9999-12-31 23:59:59:997'',@p5=N' ',@p6=0,@p7=0
Единственное, что я вижу там, чего может не быть в SQL Server 2000, - это '()' в «Выбрать верх ...», но я не уверен, что это является причиной проблемы, а также я не не знаю, как это исправить = S
Еще раз спасибо =)


У вас есть последний пакет обновления для Visual Studio и фреймворка?
Я только что проверил некоторые из моих SQL-запросов, сгенерированных Linq, и он правильно использует "Top 1" для базы данных SQL Server 2000.
Я дважды проверил сгенерированный запрос, и да, вершина сгенерирована без кавычек. Что еще не так? Я также проверил другие запросы, и они без проблем используют префикс 't0' = (
Другое дело: на сервере у нас нет SP1 для .Net Framework 3.5, поэтому я попытаюсь его обновить.
после нескольких тестов и просмотра БД я обнаружил, что проблема была в устаревшая таблица, над которым я работал: в этой таблице есть поля типа "текст". Кроме того, мне пришлось Удалить несколько инструкций "Отчетливый" во вложенном запросе, который у меня был.
Я нашел это и, просмотрев его, обнаружил, что мне нужно изменить свои запросы и что инструкция «Distinct» работает некорректно. В качестве примечания позвольте мне сказать, что вложенные запросы также могут вызывать неожиданное поведение.
Итак, настоящий урок здесь заключается в том, что если вы нужно развернуть это против SQL Server 2000, установите экземпляр сервера и протестируйте против него !!! XD
Большое спасибо за вашу помощь =)
Для информации, есть и другие известные различия - например, нетривиальная разбивка на страницы полностью не выполняется из-за отсутствия ROW_NUMBER. AFAIK, он официально не поддерживается в 2000 году, даже если некоторые простые вещи работают.
Мой оператор Linq работал на SQL2008, но сломался с тем же сообщением об ошибке на SQL2000. У меня был очень похожий запрос Linq, который работал с обоими, единственная реальная разница заключалась в том, что перед вызовом .ToList () я вызвал предложение .OrderBy (). Бывший: var query = from t1 в table1 ... ...;
list = query.OrderBy (o => o.Field) .ToList ()
Пробовал то же предложение OrderBy для сломанного запроса Linq, и он сработал!
Должен быть баг?
Включите вход и опубликуйте SQL-команду, которую она выполняет. Звучит как ошибка, но надо посмотреть ...