У меня есть этот сильно вложенный SQL-код, который хорошо работает в моем SQL Server 2008 Express.
[блок коды ниже]«База данных еще не активирована или может быть в состоянии перехода»
Однако, когда я двигаю его по нашему предварительному тестовому серверу (SQL Server 2000) не работает, если я не в полной мере использовать разрешенные ссылки на таблицы в из положений каждого оператора. Что я не могу сделать, поскольку имя базы данных зависит от установки в поле.
Это дает мне сообщение об ошибке:
Msg 913, Level 16, State 8, линии 14 Не удалось найти идентификатор базы данных 102. База данных не может быть активирована или еще может быть в переходный период.
Я нашел тему на этом форуме [sql newsgroups]; что указывает на ошибку, возникшую в результате установки незагруженного SQL-сервера.
Microsoft поддержки ссылка:This will work for ~10 minutes or until microsoft changes its website document locations.
Из ссылке:
You may receive a 913 error message when you run a query that meets the following conditions:
-
-The query includes a JOIN clause that uses ANSI SQL-92 JOIN syntax.
-The JOIN condition references a user-defined function.
-The query includes a derived table.
В статье указано, что вы могли бы решить эту проблему, исправляя установку SQL Server. (Что было бы слишком легко. И, невозможно, так как мы не можем принудительно обновлять клиентские приложения.) Или путем упрощения оператора sql; что в моем случае, вероятно, означает сокращение числа производных таблиц. В частности, это выглядит как последний с предложением GROUP BY
. (Возможно, случай с производной таблицей слишком далеко.)
Итак, как мне упростить этот запрос, не нарушая его в процессе?
Благодаря
USE [MyDatabase]
SELECT [Desc],
[Series],
[Manufacturer],
[Distributer],
MAX(LastOrdr) AS LastOrdr,
[Minimum],
SUM(Qty) AS Qty
FROM (SELECT [pptype].[Desc],
COALESCE(cStock.Serial,' ') AS Serial,
COALESCE([misccode].Descript,' ') AS Series,
COALESCE((SELECT vendors.vn_Name FROM [dbo].vendors WHERE vendors.Vn_id = [pptype].Mfg),' ') AS Manufacturer,
COALESCE((SELECT vendors.vn_Name FROM [dbo].vendors WHERE vendors.Vn_id = [pptype].Distrib),' ') AS Distributer,
[ppType].Minimum,
COALESCE(cQty.Qty,0) AS Qty,
COALESCE(cStock.Recvd,0) AS LastOrdr,
[pptype].Trkser
FROM (SELECT [Typeid], [Serial], [Series], MAX([Recvd]) AS Recvd FROM [dbo].[ppstock] WHERE [Invoice] != 'SETUP' GROUP BY [Typeid], [Serial], [Series]) cStock
LEFT OUTER JOIN [dbo].[pptype] ON
cStock.[Typeid] = [pptype].Typeid
LEFT OUTER JOIN (SELECT [Typeid], [Serial], SUM([Qty]) AS Qty FROM [dbo].[pplocatn] GROUP BY [Typeid], [Serial]) cQty ON
cStock.[Typeid] = cQty.[Typeid] AND cStock.Serial = CASE
WHEN [dbo].EMPTY(cStock.Serial) = 1 THEN 'Do not match.' ELSE cQty.[Serial] END
LEFT OUTER JOIN [dbo].[misccode] ON
cStock.[Series] = [misccode].[Code] AND [misccode].[type] = 'SERIES'
WHERE [dbo].EMPTY([pptype].Inactive) = 1 and
(COALESCE(cQty.Qty,0) < [pptype].Minimum)) cData
GROUP BY [Desc],[Series],[Manufacturer],[Distributer],[Minimum]
NOLOCK, конечно, также делает результаты менее точны, - так что, если результат может быть приближение, это нормально. – onupdatecascade