Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 SQL2000 UDFs: баг, фича, багофича ?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Запрос с использованием UDF

select c.rangeid, a.cust_number
from dbo.Agreements a
inner join #t1 AS c on dbo.fn_CustomerLifeDuration(a.cust_number, a.subr_sw_off, 1) between c.low_value and c.high_value
where a.subr_sw_off between '20020301' AND '20020331 23:59:59'

работает нормально, а вот с небольшим "изменением"

select * from(
select c.rangeid, a.cust_number
from dbo.Agreements a
inner join #t1 AS c on dbo.fn_CustomerLifeDuration(a.cust_number, a.subr_sw_off, 1) between c.low_value and c.high_value
where a.subr_sw_off between '20020301' AND '20020331 23:59:59'
) AS a

выдает ошибку

Server: Msg 913, Level 16, State 8, Line 9
Could not find database ID 101. Database may not be activated yet or may be in transition.

- Microsoft SQL Server 2000 - 8.00.604 (Intel X86) Mar 28 2002 09:48:30 Copyright (c) 1988-2000 Microsoft Corporation Enterprise Edition on Windows NT 5.0 (Build 2195: Service Pack 2)
- Скрипт выполняется из QA.
- Базы с ID 101 у меня нет.
- Из описания ошибки в BOL речь идет о процедурах и представлениях, но на всякий случай удалил и создал заново используемую UDF. Там же смутно упоминается об dbid, который должен содержаться в скомпилированном коде объекта (???)
- использование временной таблицы на выдачу ошибки не влияет
17 апр 02, 12:00    [25793]     Ответить | Цитировать Сообщить модератору
 RE:SQL2000 UDFs: баг, фича, багофича ?  [new]
jimmers
Member

Откуда: Санкт-Петербург - New York City
Сообщений: 5069
Приветствую,

Прошу прощения, как добиться версии 8.00.604?
У меня MS SQL Server 2000 EE, SP2 8.00.534.

Благодарю
17 апр 02, 13:02    [25794]     Ответить | Цитировать Сообщить модератору
 RE:SQL2000 UDFs: баг, фича, багофича ?  [new]
Glory
Member

Откуда:
Сообщений: 104760
http://support.microsoft.com/default.aspx?scid=kb;en-us;Q320434&FinishURL=/downloads/release.asp?ReleaseID=37565&area=search&ordinal=2&redirect=no&
17 апр 02, 13:07    [25795]     Ответить | Цитировать Сообщить модератору
 RE:SQL2000 UDFs: баг, фича, багофича ?  [new]
Alex_Open_m
Guest
Подобного рода ошибку встречал, но думал, что это глюк.
У меня она выскакивала именно в такой форме, когда я использовал некорректные примечания , вернее они были корректны с моей точки зрения, но выдавалась именно такая ошибка, заместо чего то типа

... Incorrect syntax near ....

Что примечательно ошибка устойчиво проявлялась, я связываю это с тем, что символы *,/,-- в моем скрипте неверно трактовались оптимизатором, но повторить ее я не смог. Лечилось выбросом комментариев и суперпозицией "переводов строк". Разбираться глубже не было времени и желания.
17 апр 02, 14:16    [25796]     Ответить | Цитировать Сообщить модератору
 RE:SQL2000 UDFs: баг, фича, багофича ?  [new]
Garya
Guest
Именно с этой ошибкой столкнулся я при динамическом скриптовании VIEW (скрипты строятся по таблицам метаданных), когда в скриптах задействована UDF. У меня она выскакивала в момент выдачи команды Create VIEW. Ошибка проявляется нестабильно. У одних VIEW прокатывает без ошибок, у других вдруг выплевывает именно приведенное тобой сообщение (и именно с этим кодом базы данных!). От чего зависит проявление и НЕ проявление бага, так и не понял. Аналогично тебе нащупал альтернативный синтаксис (который иногда, блин, генерит менее эффективный план выполнения). На сем и успокоился. Пришел к выводу, что это баг или перезаумность оптимизатора запросов.
Лично у меня создались ощущения, что вероятность подобной ошибки тем выше, чем большее количество Left Join задействовано в запросе. Тем не менее, некоторые самые громоздкие конструкции с количеством Left Join около 15 весьма успешно сохраняются, в то время как на количестве 4-5 left Join некоторые скрипты ругаются. Мне удалось выяснить, что гарантировано ошибка НЕ происходит, если во VIEW нет ни одного Left Join (откуда и возникло мое предположение). Однако, в твоем запросе никаких Left Join нет... Похоже на кривизну оптимизатора... Кстати, ты мне подсказал, в каком направлении теперь нужно рыть. Нужно попробоавть указать хинты на JOINах, чтобы оптимизатор ничего не мудрил.
17 апр 02, 15:51    [25797]     Ответить | Цитировать Сообщить модератору
 RE:SQL2000 UDFs: баг, фича, багофича ?  [new]
Alex_Open_m
Guest
Шлю пример скрипта, где высыпалась ошибка

вот запрос

SELECT RTRIM(M.Name)+' - '+G.Name GoodName,
S.Name StockName,
NULL DateAction,
NULL DocNum,
SQ2.Balance,
SQ2.Income,
SQ2.Bill,
SQ2.EndBalance,
GSID.SortID
FROM (
SELECT
IDStock,
IDGood,
SUM (
CASE
WHEN IDDocType = 9 AND DateAction <= @BegDate THEN Quant1
WHEN IDDocType = 10 AND DateAction <= @BegDate THEN -1*Quant1
WHEN IDDocType = 7 AND DateAction <= @BegDate THEN Quant2
WHEN IDDocType = 3 AND DateAction <= @BegDate THEN -1*Quant2
ELSE 0
END
) Balance,
SUM (
CASE
WHEN IDDocType = 9 AND DateAction > @BegDate AND DateAction <= @EndDate THEN Quant1
WHEN IDDocType = 7 AND DateAction > @BegDate AND DateAction <= @EndDate THEN Quant2
ELSE 0
END
) Income,
SUM (
CASE
WHEN IDDocType = 10 AND DateAction > @BegDate AND DateAction <= @EndDate THEN Quant1
WHEN IDDocType = 3 AND DateAction > @BegDate AND DateAction <= @EndDate THEN Quant2
ELSE 0
END
) Bill,
SUM (
CASE
WHEN IDDocType = 9 AND DateAction <= @EndDate THEN Quant1
WHEN IDDocType = 10 AND DateAction <= @EndDate THEN -1*Quant1
WHEN IDDocType = 7 AND DateAction <= @EndDate THEN Quant2
WHEN IDDocType = 3 AND DateAction <= @EndDate THEN -1*Quant2
ELSE 0
END
) EndBalance
FROM (
SELECT
DTG.IDGood IDGood,
D.IDStock IDStock,
DA.DateAction,
D.IDDocType,
DTG.Quant1,
DTG.Quant2
FROM Document D
INNER JOIN DocAction DA ON (DA.IDDoc = D.IDDoc
AND DA.IDDocActionType = 4
AND D.IDOwner = @IDOwner
AND D.IsComplete = 1
AND D.IDDocType IN (3,7,9,10))
INNER JOIN #T_stck TS ON (TS.IDStock = D.IDStock)
INNER JOIN DocTabGood DTG ON (D.IDDoc = DTG.IDDoc)
INNER JOIN #T_gds TG ON (TG.IDGood = DTG.IDGood)
) SQ1
GROUP BY SQ1.IDGood,SQ1.IDStock
) SQ2
INNER JOIN Stock S ON (S.IDStock = SQ2.IDStock)
INNER JOIN Good G ON (G.IDGood = SQ2.IDGood)
INNER JOIN Good_SortID GSID ON (GSID.IDGood = SQ2.IDGood)
INNER JOIN GroupGoods GG ON (GG.IDGroup = G.IDGroup)
INNER JOIN Manufacturer M ON (M.IDManufacturer = GG.IDManufacturer)
WHERE NOT (Balance = 0
AND EndBalance = 0
AND Income = 0
AND Bill = 0)
UNION ALL
SELECT
RTRIM(M.Name)+' - '+G.Name GoodName,
S.Name StockName,
DA.DateAction,
RTRIM(DT.ShortName) + ' № ' + LTRIM(RTRIM(D.DocNum)) + CASE WHEN D.IDDocType IN (3,7) THEN ' (' + RTRIM(C.Name) +')'
ELSE ''
END DocNum,
NULL Balance,
CASE WHEN D.IDDocType = 9 THEN Quant1
WHEN D.IDDocType = 7 THEN Quant2
ELSE 0
END Income,
CASE WHEN D.IDDocType = 10 THEN Quant1
WHEN D.IDDocType = 3 THEN Quant2
ELSE 0
END Bill,
NULL EndBalance,
GSID.SortID
FROM Document D
INNER JOIN DocAction DA ON (DA.IDDoc = D.IDDoc
AND DA.IDDocActionType = 4
AND D.IDOwner = @IDOwner
AND D.IsComplete = 1
AND D.IDDocType IN (3,7,9,10)
AND DA.DateAction > @BegDate
AND DA.DateAction <= @EndDate)
INNER JOIN #T_stck TS ON (TS.IDStock = D.IDStock)
INNER JOIN DocTabGood DTG ON (D.IDDoc = DTG.IDDoc)
INNER JOIN #T_gds TG ON (TG.IDGood = DTG.IDGood)
LEFT JOIN Customer C ON (C.IDCustomer = D.IDCustomer)
INNER JOIN DocType DT ON (DT.IDDocType = D.IDDocType)
INNER JOIN Stock S ON (S.IDStock = D.IDStock)
INNER JOIN Good G ON (G.IDGood = TG.IDGood)
INNER JOIN Good_SortID GSID ON (GSID.IDGood = TG.IDGood)
INNER JOIN GroupGoods GG ON (GG.IDGroup = G.IDGroup)
INNER JOIN Manufacturer M ON (M.IDManufacturer = GG.IDManufacturer)
ORDER BY 9,1,2,3
--ORDER BY GSID.SortID ASC,G.Name ASC,S.Name ASC,DateAction ASC
OPTION (/*FORCE ORDER,*/MAXDOP 1) -- Force order - включать перманентно


результат

Server: Msg 913, Level 16, State 8, Line 149
Could not find database ID 101. Database may not be activated yet or may be in transition.


в варианте без нижних комментариев и переменой местами справочников в нижнем подзапросе (Stock,Good,GroupGoods,Manufacturer) ошибки сейчас не проявляется

SELECT RTRIM(M.Name)+' - '+G.Name GoodName,
S.Name StockName,
NULL DateAction,
NULL DocNum,
SQ2.Balance,
SQ2.Income,
SQ2.Bill,
SQ2.EndBalance,
GSID.SortID
FROM (
SELECT
IDStock,
IDGood,
SUM (
CASE
WHEN IDDocType = 9 AND DateAction <= @BegDate THEN Quant1
WHEN IDDocType = 10 AND DateAction <= @BegDate THEN -1*Quant1
WHEN IDDocType = 7 AND DateAction <= @BegDate THEN Quant2
WHEN IDDocType = 3 AND DateAction <= @BegDate THEN -1*Quant2
ELSE 0
END
) Balance,
SUM (
CASE
WHEN IDDocType = 9 AND DateAction > @BegDate AND DateAction <= @EndDate THEN Quant1
WHEN IDDocType = 7 AND DateAction > @BegDate AND DateAction <= @EndDate THEN Quant2
ELSE 0
END
) Income,
SUM (
CASE
WHEN IDDocType = 10 AND DateAction > @BegDate AND DateAction <= @EndDate THEN Quant1
WHEN IDDocType = 3 AND DateAction > @BegDate AND DateAction <= @EndDate THEN Quant2
ELSE 0
END
) Bill,
SUM (
CASE
WHEN IDDocType = 9 AND DateAction <= @EndDate THEN Quant1
WHEN IDDocType = 10 AND DateAction <= @EndDate THEN -1*Quant1
WHEN IDDocType = 7 AND DateAction <= @EndDate THEN Quant2
WHEN IDDocType = 3 AND DateAction <= @EndDate THEN -1*Quant2
ELSE 0
END
) EndBalance
FROM (
SELECT
DTG.IDGood IDGood,
D.IDStock IDStock,
DA.DateAction,
D.IDDocType,
DTG.Quant1,
DTG.Quant2
FROM Document D
INNER JOIN DocAction DA ON (DA.IDDoc = D.IDDoc
AND DA.IDDocActionType = 4
AND D.IDOwner = @IDOwner
AND D.IsComplete = 1
AND D.IDDocType IN (3,7,9,10))
INNER JOIN #T_stck TS ON (TS.IDStock = D.IDStock)
INNER JOIN DocTabGood DTG ON (D.IDDoc = DTG.IDDoc)
INNER JOIN #T_gds TG ON (TG.IDGood = DTG.IDGood)
) SQ1
GROUP BY SQ1.IDGood,SQ1.IDStock
) SQ2
INNER JOIN Stock S ON (S.IDStock = SQ2.IDStock)
INNER JOIN Good G ON (G.IDGood = SQ2.IDGood)
INNER JOIN Good_SortID GSID ON (GSID.IDGood = SQ2.IDGood)
INNER JOIN GroupGoods GG ON (GG.IDGroup = G.IDGroup)
INNER JOIN Manufacturer M ON (M.IDManufacturer = GG.IDManufacturer)
WHERE NOT (Balance = 0
AND EndBalance = 0
AND Income = 0
AND Bill = 0)
UNION ALL
SELECT
RTRIM(M.Name)+' - '+G.Name GoodName,
S.Name StockName,
DA.DateAction,
RTRIM(DT.ShortName) + ' № ' + LTRIM(RTRIM(D.DocNum)) + CASE WHEN D.IDDocType IN (3,7) THEN ' (' + RTRIM(C.Name) +')'
ELSE ''
END DocNum,
NULL Balance,
CASE WHEN D.IDDocType = 9 THEN Quant1
WHEN D.IDDocType = 7 THEN Quant2
ELSE 0
END Income,
CASE WHEN D.IDDocType = 10 THEN Quant1
WHEN D.IDDocType = 3 THEN Quant2
ELSE 0
END Bill,
NULL EndBalance,
GSID.SortID
FROM Document D
INNER JOIN DocAction DA ON (DA.IDDoc = D.IDDoc
AND DA.IDDocActionType = 4
AND D.IDOwner = @IDOwner
AND D.IsComplete = 1
AND D.IDDocType IN (3,7,9,10)
AND DA.DateAction > @BegDate
AND DA.DateAction <= @EndDate)
INNER JOIN #T_stck TS ON (TS.IDStock = D.IDStock)
INNER JOIN DocTabGood DTG ON (D.IDDoc = DTG.IDDoc)
INNER JOIN #T_gds TG ON (TG.IDGood = DTG.IDGood)
LEFT JOIN Customer C ON (C.IDCustomer = D.IDCustomer)
INNER JOIN Good_SortID GSID ON (GSID.IDGood = TG.IDGood)
INNER JOIN DocType DT ON (DT.IDDocType = D.IDDocType)
INNER JOIN GroupGoods GG ON (GG.IDGroup = G.IDGroup)
INNER JOIN Manufacturer M ON (M.IDManufacturer = GG.IDManufacturer)
INNER JOIN Good G ON (G.IDGood = TG.IDGood)
INNER JOIN Stock S ON (S.IDStock = D.IDStock)
ORDER BY 9,1,2,3
OPTION (MAXDOP 1)


вот такие чудеса. Причем ошибка проявляется местами и не постоянно, что особенно обидно
18 апр 02, 06:53    [25798]     Ответить | Цитировать Сообщить модератору
 RE:SQL2000 UDFs: баг, фича, багофича ?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Спасибо за отклики. Значит запишем это как особенность планировщика.

А что все-таки это за dbid ?
"When a compiled object is first created, the dbid where the object is located is embedded in the compiled code."
BOL - Troubleshooting - Error Messages - Error Message Descriptions - Resolving System Error Messages - Error 913
20 апр 02, 10:36    [25799]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: SQL2000 UDFs: баг, фича, багофича ?  [new]
Alik
Member

Откуда: Ukraine
Сообщений: 24
MS подтверждает что ето проблема ( [url=http://]support.microsoft.com/default.aspx?scid=kb;en-us;834688[/url] ) и предлагает обращаться за фиксом, но прямого доступа к нему нет.
У меня проявляется просто:
Удалили базу HHCPDM и создали ее снова скриптом, после чего запрос из другой базы на этом же сервере типа
DELETE FROM HHCPDM.dbo.Imp_SalesOrderQty
возвращает
Server: Msg 913, Level 16, State 8, Line 1
Could not find database ID 10. Database may not be activated yet or may be in transition.

Приэтом ошибка возникает не всегда, только в слуае обращения из контекста баз, где подобны запрос выполнялся до пересоздания.
19 май 04, 22:42    [688663]     Ответить | Цитировать Сообщить модератору
 Re: SQL2000 UDFs: баг, фича, багофича ?  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Еще в эту же тему:

http://support.microsoft.com/default.aspx?scid=kb;en-us;819264&Product=sql2k
20 май 04, 07:54    [688897]     Ответить | Цитировать Сообщить модератору
 Re: SQL2000 UDFs: баг, фича, багофича ?  [new]
aag
Member

Откуда: Москва
Сообщений: 1955
А если во втором запросе алиас "a" поменять на любой другой, ошибка остается?

Nobody faults but mine... (LZ)
20 май 04, 12:10    [689752]     Ответить | Цитировать Сообщить модератору
 Re: SQL2000 UDFs: баг, фича, багофича ?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Спасибо всем.
Но обратите пожалуйста внимание на дату создания данного топика. Проблема уже давно локализована.
20 май 04, 12:12    [689760]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить