MS SQL Server - Incorrect syntax near...

User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

MS SQL Server - Incorrect syntax near...

Post by Sabina »

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

Есть batch скрипт, запускающий набор SQL скриптов через isql.
На одном сервере (MS SQL 2000) все проходит без проблем. На другом валится с сообщением "Incorrect syntax near '+' ".
Никакого '+' в SQL скрипте на котором batch валится нет.

Никому не приходилось сталкиваться с такой проблемой? Все что я нашла в Интернете - это про баг, который был пофиксен в MS SQL7 SP1 (но у нас 2000) и еще что-то про настройки. Но ни в одном, прочитанным мною сообщении сервер не жаловался на знак, которого даже нет в SQL стейтменте.

Сабина
User avatar
Rumrunner
Уже с Приветом
Posts: 540
Joined: 07 Aug 2002 16:09
Location: Orange County, CA

Post by Rumrunner »

Если скрипт делает INSERT, UPDATE или DELETE в какую-нибудь таблицу, имеющей триггер с ошибкой, то такое очень даже может быть. Надо триггера проверить.
User avatar
KVA
Уже с Приветом
Posts: 5347
Joined: 03 Feb 1999 10:01
Location: NJ, USA

Post by KVA »

DECLARE @x1 NVARCHAR(100)
DECLARE @x2 NVARCHAR(100)
DECLARE @str1 NVARCHAR(100)
DECLARE @str2 NVARCHAR(100)

SET @x1 = '123456'
SET @x2 = '+'
SET @str1 = 'SELECT * FROM t WHERE xyz = ' + @x1
SET @str2 = 'SELECT * FROM t WHERE xyz = ' + @x2

EXEC @str1
EXEC @str2

На счет синтаксиса не уверен, но смысл должен быть понятен. Второй EXEC по идее должен упасть. Возможно набор скриптов принимает разные параметры на разных серверах.
User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

Post by Sabina »

KVA wrote:На счет синтаксиса не уверен, но смысл должен быть понятен. Второй EXEC по идее должен упасть. Возможно набор скриптов принимает разные параметры на разных серверах.


В самом SQL скрипте нет параметров. Он просто делает bunch of test data inserts.

Теория с триггерами интересна. А как триггеры можно проверить на ошибки?
Мы с эдентичными базами работаем уже давно, то есть триггеры оттестированы и делают что надо.
А тут вдруг при очередном прогоне test DB Create скриптов, вывалилась такая ерунда. Скрипты точно никто не менял, я посмотрела history по VSS.

Сабина
User avatar
Strannik223
Уже с Приветом
Posts: 569
Joined: 14 Dec 2003 04:06
Location: Львов->Киев->Торонто

Post by Strannik223 »

А нету нигде динамического формирования сиквела типа sp_exec_sql или как он там называется?
Коме того выдается номер строчки где сбой произошел
Никакой разрухи нет. (с) Проф. Преображенский.
User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

Post by Sabina »

Strannik223 wrote:А нету нигде динамического формирования сиквела типа sp_exec_sql или как он там называется?
Коме того выдается номер строчки где сбой произошел


Собственно вот он SQL скрипт:

Code: Select all

SET NOCOUNT ON
GO

PRINT ('Inserting data into [table1] ...')
SET IDENTITY_INSERT [table1] ON
GO

INSERT INTO [table1](att1, att2.....)
VALUES (value1, value2,...);

[one more similar insert here]

SET IDENTITY_INSERT [table1] OFF
GO

....here go similar inserts for the bunch of other tables

Actually I'vе found a piece with parameters:


SET IDENTITY_INSERT Project ON
GO

DECLARE @utcDate datetime
SET @utcDate = GETUTCDATE()
INSERT INTO PROJECT
( projectID, workOrderNum, projectName, deptName, reqDeptName,
assignedBy, assignedDt, targetDt, isPriority,
statusCode, typeCode, description, lastUpdatedBy)
VALUES (1, N'MYORDER 1', N'New router Cisco', N'MYDEPT', N'ASKING DEPT',
2, @utcDate, N'2003-09-02', 1,
N'EIP', N'DAT', N'Router Cisco ultra', 2);
GO

SET IDENTITY_INSERT Project OFF
GO


--===================================================================
-- The following section is to maintain integrity of the IDENTITY COLUMN
-- Script to Insert data should be done before this section
--====================================================================
 
PRINT ('FINISHED LOADING TEST DATA' )
GO


PRINT ('CONDUCTING IDENTITY MAINTENANCE ...')
GO

DBCC CHECKIDENT (WNTUser, RESEED,1)
DBCC CHECKIDENT (WNTUser, RESEED)
GO

......similar checks


PRINT ('FINISHED IDENTITY MAINTENANCE')
GO

SET NOCOUNT OFF
GO


В батче запускается командой:
isql -S %server% -d %db% -U %user% -i testdata.sql -r 1 -b -n


Сабина
User avatar
Rumrunner
Уже с Приветом
Posts: 540
Joined: 07 Aug 2002 16:09
Location: Orange County, CA

Post by Rumrunner »

Варианты решения проблемы:
1. Запустить батч строкой
isql -S %server% -d %db% -U %user% -i testdata.sql -o testlog.txt
и почитать testlog.txt
или
2. Разбить батч на несколько батчей так, чтобы каждый батч делал INSERT не более чем в одну таблицу. Либо последовательно комментировать все INSERTы, оставляя незакомментированным INSERT только в одну таблицу. Посмотреть, при INSERTе в какую таблицу батч выдаст ошибку и сделать вывод, в какой таблице триггер содержит ошибку.
User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

Post by Sabina »

Rumrunner wrote:Варианты решения проблемы:
1. Запустить батч строкой
isql -S %server% -d %db% -U %user% -i testdata.sql -o testlog.txt
и почитать testlog.txt
или
2. Разбить батч на несколько батчей так, чтобы каждый батч делал INSERT не более чем в одну таблицу. Либо последовательно комментировать все INSERTы, оставляя незакомментированным INSERT только в одну таблицу. Посмотреть, при INSERTе в какую таблицу батч выдаст ошибку и сделать вывод, в какой таблице триггер содержит ошибку.


Спасибо вам большое за подсказку. N1 я им уже велела завтра утром сделать. А вот для N2 видимо придется туда завтра самой после работы тащиться.

Сабина
User avatar
Dmitry67
Уже с Приветом
Posts: 28294
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Post by Dmitry67 »

Еще идея
При формировании скрипта в строки затесался апостроф
Например dept называется pond d'alma
Сформирован insert ... N'pond d'alma', ....
вместо N'pond d''alma', ...
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

Post by Sabina »

Sabina wrote:Спасибо вам большое за подсказку. N1 я им уже велела завтра утром сделать. А вот для N2 видимо придется туда завтра самой после работы тащиться.


Ой ну цирк. Прогнали они сегодня утром N1 и пишут мне - спасибо-де за подсказку. Все сработало нормально.

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

Сабина

Return to “Вопросы и новости IT”