Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.07.11;
Скачать: [xml.tar.bz2];

Вниз

Ошибка при исполнении MSSQL-скрипта..   Найти похожие ветки 

 
Digitman ©   (2004-06-11 12:39) [0]

С MSSQL2000-сервером и синтаксисом евойных скриптов я практически  не знаком, просто не доводилось до сей поры (и сто лет бы еще не довелось), но вот таки пришлось столкнуться с проблемой, которую нужно бы преодолеть, особо не вникая в подробности..

суть проблемы :

при прогоне нижеприведенного скрипта ODBC-tracer зафиксировал  отказ сервера

DIAG [42000]
[Microsoft][ODBC SQL Server Driver][SQL Server]
Must declare the variable "@PERIOD". (137)

"Create procedure _1sp_CJ7287_UpdateFF(@IDS CHAR(9), @Date DATETIME, @ID INTEGER, @Mode INTEGER) AS
SET NOCOUNT ON
DECLARE @FFStr CHAR(255)
DECLARE @StartDate DATETIME
DECLARE @Period CHAR(9)
DECLARE @FF0 CHAR(9)
EXECUTE _1sp_GetBeginOfPeriod @Date, "M", @StartDate OUTPUT
SELECT @StartDate=DATEADD( dd, 0, @StartDate )
IF @StartDate>@Date BEGIN
SELECT @StartDate=DATEADD( dd, -1, @StartDate )
EXECUTE _1sp_GetBeginOfPeriod @StartDate, "M", @StartDate OUTPUT
END
SELECT @Period=CONVERT( CHAR(8), @StartDate, 112 )+"M"
IF @Mode=2 or @Mode=1
DECLARE Cur_CJ7287 CURSOR FOR SELECT PERIOD,FF6026 FROM CJ7287 WHERE IDS=@IDS FOR UPDATE OF FF6026
ELSE IF @Mode=0 BEGIN
IF @Date>"17530101"
DECLARE Cur_CJ7287 CURSOR FOR SELECT PERIOD,FF6026 FROM CJ7287 WHERE IDS=@IDS AND PERIOD>=@Period FOR UPDATE OF FF6026
ELSE
DECLARE Cur_CJ7287 CURSOR FOR SELECT PERIOD,FF6026 FROM CJ7287 WHERE IDS=@IDS FOR UPDATE OF FF6026
END
OPEN Cur_CJ7287
FETCH NEXT FROM Cur_CJ7287 INTO @Period,@FF0
WHILE @@FETCH_STATUS=0 BEGIN
SELECT @StartDate=SUBSTRING(@Period,1,8)
SELECT @FF0=SP6026 FROM SC6049(NOLOCK) WHERE ID=@IDS
UPDATE CJ7287 SET FF6026=ISNULL(@FF0," 0 ") WHERE CURRENT OF Cur_CJ7287
FETCH NEXT FROM Cur_CJ7287 INTO @PERIOD, @FF0
END
CLOSE Cur_CJ7287
DEALLOCATE Cur_CJ7287"


Господа, выручайте, вразумите меня, тундру, где здесь что не так ? C какого перепугу кто-то там, с т.з. сервера, якобы должен декларировать переменную @PERIOD, если я своими глазами вижу, что эта декларация в теле SP присутствует ? Или скриптовый движок сервера регистрочувствителен в отношении идентификаторов ?


 
Fiend ©   (2004-06-11 12:48) [1]

а почему бы не воспользоваться родными утилитами сервера?
и скажи какой сервер?


 
Fiend ©   (2004-06-11 12:51) [2]

с точки зрения синтаксиса всё верно, и SQL Analyzer это подтверждает


 
Oksana ©   (2004-06-11 13:02) [3]

переменная DECLARE @Period CHAR(9) используется и в условии запроса для курсора :
CURSOR FOR SELECT PERIOD,FF6026 FROM CJ7287 WHERE IDS=@IDS AND PERIOD>=@Period FOR UPDATE OF FF6026
и для приема значений :
FETCH NEXT FROM Cur_CJ7287 INTO @PERIOD, @FF0

может попробовать объявить дополнительно,например, @PERIOD111 и ее использовать в строках
FETCH NEXT FROM Cur_CJ7287 INTO @PERIOD111, @FF0


 
bushmen ©   (2004-06-11 13:03) [4]

Какой collation на сервере стоит? Замени @PERIOD на @Period


 
Digitman ©   (2004-06-11 13:32) [5]


> Fiend ©   (11.06.04 12:48) [1]
> а почему бы не воспользоваться родными утилитами сервера?
> и скажи какой сервер?


скрипт генерирую не я - это делает платформа 1Сv77 R21 в своих "потрохах", когда формирует инф.базу на основе метаданных некоей конфигурации

сервер MS SQL 2000 (Service Pack 3)


> Fiend ©   (11.06.04 12:51) [2]
> с точки зрения синтаксиса всё верно, и SQL Analyzer это
> подтверждает


да вот уж и я, не слишком искушенный в этих вопросах, думаю - все вроде бы корректно ... и с чего бы беда такая ? ... хм ..


> Oksana ©   (11.06.04 13:02) [3]



> переменная DECLARE @Period CHAR(9) используется и в условии
> запроса для курсора .. и для приема значений


правильно ли я понимаю тебя, что это не есть легально (корректно ?) по логике SP-движка с т.з. сервера ?


> может попробовать объявить


сама идея понятна, но, увы, - неволен что-либо менять .. см. ответ Fiend"e..


> bushmen ©   (11.06.04 13:03) [4]
> Какой collation на сервере стоит?


Ты имеешь ввиду, какая collation была установлена "ручками" при создании инф.базы ?

Cyrillic_General_CI_AS

сделано это не от балды - имеено такую collation 8-я платформа автоматически установила при генерации инф.базы

p.s.

какие-то еще идеи найдутся ? .. заранее благодарен ..


 
Johnmen ©   (2004-06-11 13:41) [6]

>Digitman ©

Есть предположение, что используемые в ХП переменные @Period и @PERIOD суть разные вещи. А вторая не объявлена...


 
bushmen ©   (2004-06-11 13:42) [7]

>Digitman ©   (11.06.04 13:32) [5]

Вы видимо не до конца мой пост прочли.


 
Fiend ©   (2004-06-11 13:45) [8]

если рассуждать логически:
т.к. синтаксис верный, и есть тому подтверждение, но процедура всё равно создаваться не хочет, то может проблема в драйвере ОДБЦ?
1С никаких рекомендаций по этому поводу не даёт? или они сами ставят вместе с собой драйвер?


 
freeman82   (2004-06-11 13:50) [9]

Может поможет !!!

Error 137
Severity Level 15
Message Text
Must declare the variable "%.*ls".

Explanation
This error occurs when a variable is used in a SQL script without first declaring the variable. This example returns error 137:

SET @mycol = "ContactName"
SELECT @mycol
GO

One of the more complicated causes of this error includes the use of a variable that was declared outside the EXECUTE statement. For example:

USE Northwind
GO
DECLARE @mycol nvarchar(20)
SET @mycol = "ContactName"
EXECUTE ("SELECT @mycol FROM Customers")

Action
Verify that any variables used in a SQL script are declared before being used elsewhere in the script.

Rewrite the procedure so that it does not reference variables in the EXECUTE statement that were declared outside of it.

USE Northwind
GO
DECLARE @mycol nvarchar(20)
SET @mycol = "ContactName"
EXECUTE ("SELECT " + @mycol + " FROM Customers")


 
Fiend ©   (2004-06-11 13:54) [10]

то freeman82
не поможет, у него такое не используется


 
bushmen ©   (2004-06-11 13:55) [11]

>USE Northwind
>GO
>DECLARE @mycol nvarchar(20)
>SET @mycol = "ContactName"
>EXECUTE ("SELECT @mycol FROM Customers")

Так никто не делает. Если хочешь через EXECUTE, то надо писать так:
set @mycol="SELECT ContactName FROM Customers"
EXECUTE(@mycol)


Если хочешь оставить параметры, то смотри хелп по sp_executesql


 
freeman82   (2004-06-11 13:59) [12]

>bushmen
>Так никто не делает. Если хочешь через EXECUTE, то надо писать так:
set @mycol="SELECT ContactName FROM Customers"
EXECUTE(@mycol)
А так никто и не делает это выдержка из BOL

Неправильно
USE Northwind
GO
DECLARE @mycol nvarchar(20)
SET @mycol = "ContactName"
EXECUTE ("SELECT @mycol FROM Customers")

Правильно
USE Northwind
GO
DECLARE @mycol nvarchar(20)
SET @mycol = "ContactName"
EXECUTE ("SELECT " + @mycol + " FROM Customers"
)


 
freeman82   (2004-06-11 14:10) [13]

>bushmen
Да и кстати
set @mycol="SELECT ContactName FROM Customers"
EXECUTE(@mycol)
работать не будет


 
Skyle ©   (2004-06-11 14:18) [14]


> freeman82   (11.06.04 14:10) [13]


> set @mycol="SELECT ContactName FROM Customers"
> EXECUTE(@mycol)
> работать не будет

Почему это?
Если до этого заюзана правильная БД, то очень даже будет.
Например, если поставить перед set @mycol строку USE Northwind, то всё будет работать на ура.


 
freeman82   (2004-06-11 14:21) [15]

>bushmen
Извини будет,просто надо  DECLARE @mycol nvarchar(200)
>Digitman
Если есть возможность попробуи в QA,он помоему покажет в какой строке ошибка,уже легче...


 
Digitman ©   (2004-06-11 14:37) [16]


> bushmen ©   (11.06.04 13:42) [7]
> Вы видимо не до конца мой пост прочли.


ну почему же ? прочел достаточно внимательно ..

Server Collation = Cyrillic_General_CS_AS

есть предложение установить иное значение Server Collation ?
если да, то какое порекомендуешь ?

это можно сделать без реинсталляции сервера ?

если я правильно понял, то DB Collation вне зависимости от значения не перекрывает значение Server Collation (эти сollations имеют абсолютно разные назначения), и это как раз и может влиять на корректность парсинга скрипта процедуры при его прогоне ?


 
bushmen ©   (2004-06-11 14:40) [17]

>ну почему же ? прочел достаточно внимательно ..

Я и говорю, что не внимательно. После вопроса про Collation я посоветовал переменную @PERIOD переписать в соответствии с ее объявлением - @Period.


 
Fiend ©   (2004-06-11 14:43) [18]

та не может он скрипт поправить!!! чё не видно?! открытым же текстом пишет человек.


 
Fiend ©   (2004-06-11 14:47) [19]

то Digitman:
Сергей, скажи а вообще у тебя есть клиентские утилиты от сервера?
Если есть то для эксперимента проверки коллэйта возьми этот скрипт, подключись к БД и сделай Parse(Ctrl+F5). Если проблема с коллэйтом существует, то он выдаст ту же ошибку.


 
bushmen ©   (2004-06-11 14:52) [20]

>Fiend ©

Да неужели? А что, разве после установки 1C трудно зайти в Enterprise Manager и ручками подправить ?


 
Fiend ©   (2004-06-11 14:53) [21]

я говорю это из слов автора. Раз он сказал, значит не может, т.к. я этого магического продукта к счастью не использую


 
bushmen ©   (2004-06-11 14:55) [22]

>я этого магического продукта к счастью не использую

Думаю, что вряд ли напишут программу, в которой сначала создают хранимую процедуру (причем, постоянно одного и того же содержания), а потом ее запускают на выполнение :)))


 
Digitman ©   (2004-06-11 15:18) [23]


> Fiend ©   (11.06.04 14:47) [19]


есть, конечно ..

но - еще раз повторюсь - нет ни малейшего желания (да и времени) "заморачиваться" изучением инстр.средств и пр. и пр. ... задача и проблема в ней - буквально разовая ... мне просто необходимо понять, откуда ноги ростут у проблемы ... далее я соображу и приму решение, не распыляясь на тонкости ...

ибо IB/FB-серверы - родные, мне не жалко ни сил ни времени на "раскопки" в этой среде, случись что ..  а здесь - иная ситуация : попросили вот, пообещал людям (рву волосы на многострадальной своей лысине и посыпаю ее пеплом, что согласился эт дело провернуть !) и неприятно врюхался (ну как еще сказать ?).. скорее всего, конечно - от незнания ни этой дурной платформы ни мелкомягкого сиквел-сервера

вот-с, примерно так хотелось бы это сделать ...


> Если есть то для эксперимента проверки коллэйта возьми этот
> скрипт, подключись к БД и сделай Parse(Ctrl+F5). Если проблема
> с коллэйтом существует, то он выдаст ту же ошибку.


да, спасибо ... у меня уже мелькнула эта мысль ... скорее всего, если сейчас с коллэйтом дело в гору не пойдет, так и сделаю .. как бы ни не хотелось мне заниматься этим(


> может проблема в драйвере ОДБЦ?
> 1С никаких рекомендаций по этому поводу не даёт? или они
> сами ставят вместе с собой драйвер?


одибиси-драйвер, разумеется, одноэсом не поставляется, эти ушлые парни всегда кивали и кивать будут на Майкрософт, ибо под майкрософтовскую дудку и пляшут всю жизнь .. при этом, как я понял, привнося в свое зависимое от майкрософта ПО соверженно дурацкую и нелогичную "оригинальность"  ... ну да не будем о том , мне, ч.г., по барабану : задышала бы вся эта петрушка, а дальше - трава не расти)


> bushmen ©   (11.06.04 14:52) [20]


что-то не въеду я пока, каким образом мне сменить коллэйт сервера ..

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


 
Digitman ©   (2004-06-11 15:46) [24]


> bushmen ©   (11.06.04 14:55) [22]


так, процесс пошел вроде бы ...

как изменить коллэйт сервера, я знаю

вопрос : какие варианты коллэйта следует попробовать ?


 
Бир абасы   (2004-06-11 15:53) [25]

Cyrillic_General_CI_AS


 
Digitman ©   (2004-06-11 15:59) [26]


> Бир абасы   (11.06.04 15:53) [25]
> Cyrillic_General_CI_AS


попробовал ... результат - тот же ...

видимо не в коллейте дело или иное значение следует попробовать ... пока еще ума не приложу, какое ...


 
Petr V. Abramov ©   (2004-06-11 16:19) [27]

А все ж попробовать дозвониться в чудесную :) техподдержку. В Москве это иногда удается, у меня пару раз получалось. А так репу можно очень долго чесать, а потом окажется, что чесали не там :)


 
Бир абасы   (2004-06-11 16:20) [28]

Вообще мутно все это как-то...
В одном месте ты пишешь, что работаешь с 21-ым релизом версии 7.7, в другом, что "8-я платформа автоматически установила...".
Опять-таки где у тебя Cyrillic_General_CI_AS и где Cyrillic_General_CS_AS??? Хотя это тут роли не должно играть, так как в обоих случаях стоит AS, что и должно влиять на именование переменных и т.д.
Да, кстати, каким макаром ты собираешься менять collation у установленного сервера? Просвети.


 
Digitman ©   (2004-06-11 16:45) [29]


> Бир абасы   (11.06.04 16:20) [28]
> Вообще мутно все это как-то...
> В одном месте ты пишешь, что работаешь с 21-ым релизом версии
> 7.7, в другом, что "8-я платформа автоматически установила...".


про 8-ку я, вероятно, упомянул всуе...

из проф.любопытства это - некое время назад ставил 8-ку и смотрел, что за "фрукт" - надо же хоть как-то держать себя в курсе "мировых событий" на поприще "шахматных интерпретаторов")... в т.ч. и сей факт для себя отметил там, насчет коллэйта ... оттуда ноги и растут ...

не "работаю" я ни с 21-м релизом ни с каким бы то ни было иным -мне кажется, ясно тему осветил..


> где у тебя Cyrillic_General_CI_AS и где Cyrillic_General_CS_AS?


на дан.момент первое - в коллейте собственно инф.базы, второе - в коллейте сервера


> каким макаром ты собираешься менять collation у установленного
> сервера?


откуда ж мне знать ? я вижу в реестре соотв.параметр, который, по моему представлению, сервер-сервис считывает при старте ...

если механика иная - просвети уж и ты меня, бестолкового ? ...


 
Fiend ©   (2004-06-11 16:50) [30]

то Digitman
к сожалению установленному серверу поменять коллэйт нельзя, как и другим созданным объектам, например БД или таблицы.
придётся всё переставлять и пересоздавать.
но я бы всё попробовал выполнить скрипт через "РОДНЕЙШИЕ" серверу утилиты. ибо если в нём выполлняется а где то нет - значит проблема не в скрипте!


 
Бир абасы   (2004-06-11 16:53) [31]

откуда ж мне знать ? я вижу в реестре соотв.параметр, который, по моему представлению, сервер-сервис считывает при старте ...
Не сменишь ты collation у установленного сервера. Это мое IMNSHO.
А также есть определенное подозрение, что мы лечим последствия, а не причину. Ты писал "когда формирует инф.базу на основе метаданных некоей конфигурации". Так вот, лучше ты опиши последовательно все свои действия: как ты создаешь эту базу, на основе метаданных какой конфигурации и т.д.???
Уж не первый день я с этим хозяйством работаю, но такой "попандос" не имел ни разу...


 
Fiend ©   (2004-06-11 16:53) [32]

кстати насчёт "нехочу заморачиваться". там всё очень просто и интуитивно ясно буквально пару кликом мышкой


 
User_Name   (2004-06-11 16:56) [33]

Задайте этот вопрос на SQL.ru - там точно должны ответить.

ИМХО - проблема именно в том, про что написала
      Oksana ©   (11.06.04 13:02) [3]

P.S. По крайней мере у меня (MSSQL 200 SP 3) такие вещи не проходят


 
Ega23 ©   (2004-06-11 18:31) [34]

к сожалению установленному серверу поменять коллэйт нельзя, как и другим созданным объектам, например БД или таблицы.
придётся всё переставлять и пересоздавать.

Можно. Но очень сложно. У меня шеф месяца 2 бился, пока не изватился через задницу, но поменял.


 
Бир абасы   (2004-06-11 18:38) [35]

2 Ega23 ©   (11.06.04 18:31) [34]
А стоило ли это того? :-)


 
Ega23 ©   (2004-06-11 19:22) [36]

А стоило ли это того? :-)

Стоило. На объектах надо с 7-го на 2000-ый сервер переходить.



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2004.07.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.05 c
1-1088031380
sashapont
2004-06-24 02:56
2004.07.11
Как организовать правильно Drag&Drop


14-1088074044
infom
2004-06-24 14:47
2004.07.11
Кто какими компонентами в основном пользуется ?


1-1087820527
Klerk
2004-06-21 16:22
2004.07.11
Про Excel


1-1087980934
HF-Trade
2004-06-23 12:55
2004.07.11
Порзрачный фон для TBitmap


1-1087796493
ПсихЪ
2004-06-21 09:41
2004.07.11
Функции из DCU





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский