2009-08-12 2 views
3

У меня есть этот сильно вложенный 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] 

ответ

1

Итак, это то, что я закончил делать. Я разделил внутреннюю инструкцию sql и использовал синтаксис DECLARE @foo TABLE для создания временной таблицы, которую я заполнил INSERT INTO. Затем я использовал временную таблицу для окончательного выбора.

Эта процедура компилируется в тестовой среде SQL Server 2000; хотя я еще не начал свое альфа-тестирование. Если это не закончится, я отправлю обратно.

Спасибо.

DECLARE @cData TABLE (
    [Desc] VARCHAR(25), 
    [Series] VARCHAR(40), 
    [Manufacturer] VARCHAR(30), 
    [Distributer] VARCHAR(30), 
    [LastOrdr] CHAR(8), 
    [Minimum] SMALLINT, 
    [Qty] INT 
) 

INSERT INTO @cData (
    [Desc], 
    [Series], 
    [Manufacturer], 
    [Distributer], 
    [LastOrdr], 
    [Minimum], 
    [Qty] 
) 
    SELECT [pptype].[Desc], 
      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, 
      COALESCE(cStock.Recvd,0) AS LastOrdr, 
      [ppType].Minimum, 
      COALESCE(cQty.Qty,0) AS Qty 
     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) 
     ORDER BY [Desc],[Series],[Manufacturer],[Distributer],[Minimum] 


SELECT [Desc], 
    [Series], 
    [Manufacturer], 
    [Distributer], 
    MAX(LastOrdr) AS LastOrdr, 
    [Minimum], 
    SUM(Qty) AS Qty 
FROM @cData 
GROUP BY [Desc],[Series],[Manufacturer],[Distributer],[Minimum] 
ORDER BY [Desc],[Series],[Manufacturer],[Distributer],[Minimum] 

0

Вы можете быть в курсе, но я бы предложил использовать (NOLOCK) намек на таблицы вызовов, поскольку ваш запрос включает в себя множество таблиц есть вероятность для блокировки стола. Позвольте мне знать, если это помогает.

Также я думаю, что вы можете использовать CTE для вашего запроса. Попробуй.

+0

NOLOCK, конечно, также делает результаты менее точны, - так что, если результат может быть приближение, это нормально. – onupdatecascade

1

Можете ли вы просто разбить одну из внутренних производных таблиц на временную таблицу? IE:

SELECT [Typeid], [Serial], [Series], MAX([Recvd]) AS Recvd 
INTO #InnerTable1 
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 


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 #InnerTable1) cData 
GROUP BY [Desc],[Series],[Manufacturer],[Distributer],[Minimum] 

Это должно сработать, поскольку внутренний стол - это все, на основе вашего внешнего запроса. Если бы были задействованы объединения, и вы выбирали из других таблиц на основе внутренних данных, тогда меня беспокоила возможность изменения данных, которые происходят между этими двумя запросами, но поскольку вы выбираете все свои данные из самого внутреннего соединения , не должно быть никаких проблем с использованием таблицы temp.

Если это почему-то не работает, отправьте сообщение, и я попытаюсь настроить его еще немного, чтобы он это сделал.

+0

На самом деле это то, над чем я сейчас работаю. Если это сработает, я отправлю код. – Cynthia

Смежные вопросы