Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Ошибка при исполнении MSSQL-скрипта.. [MSSQL]


Страницы:   1 2

Digitman ©   (2004-06-11 12:39:00) 

С 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 присутствует ? Или скриптовый движок сервера регистрочувствителен в отношении идентификаторов ?


Digitman   (2004-06-11 14:37:00) [21]


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


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

Server Collation = Cyrillic_General_CS_AS

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

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

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


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

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


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


> freeman82   (11.06.04 14:10) [13]


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

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


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

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


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

>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'
)


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

>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


Fiend   (2004-06-11 13:54:00) [27]

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


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

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

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:45:00) [29]

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


bushmen   (2004-06-11 13:42:00) [30]

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

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


Johnmen   (2004-06-11 13:41:00) [31]

>Digitman ©

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


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


> 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.

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


bushmen   (2004-06-11 13:03:00) [33]

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


Oksana   (2004-06-11 13:02:00) [34]

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

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


Fiend   (2004-06-11 12:51:00) [35]

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


Fiend   (2004-06-11 12:48:00) [36]

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо