Ошибка sql неверный синтаксис что это

SQL Server 2012 Enterprise SQL Server 2012 Business Intelligence SQL Server 2012 Developer SQL Server 2012 Standard SQL Server 2012 Web SQL Server 2012 Express Еще…Меньше

Пакет обновления 1 для Microsoft SQL Server 2012 распространяются как один загружаемый файл. Учитывая, что исправления являются накопительными, каждый выпуск содержит все исправления и все исправления безопасности, которые были включены в Пакет обновления 1 для предыдущего SQL Server 2012 выпуска исправлений.

Симптомы

При выполнении инструкции Transact-SQL в SQL Server 2012, появляется следующее сообщение об ошибке:

Неправильный синтаксис около «begi».


Эта проблема возникает при выполнении следующих условий:

  • Инструкция содержит условие IF .

  • Условие IF не содержит инструкции BEGIN и END .

  • Условие IF следует блок BEGIN TRY .

  • Если блок перекомпилируется при выполнении запроса.

Решение

Информация о накопительном пакете обновления

Накопительное обновление 4 для SQL Server 2012 с пакетом обновления 1

Исправление, устраняющее эту проблему, сначала было выпущено в накопительное обновление 4. Дополнительные сведения о том, как получить этот накопительный пакет обновления для SQL Server 2012 с пакетом обновления 1 щелкните следующий номер статьи, чтобы перейти к статье базы знаний Майкрософт:

2833645 накопительного обновления 4 для SQL Server 2012 с пакетом обновления 1Примечание. Учитывая, что построения являются накопительными, каждый новый выпуск исправление содержит все исправления и все исправления, входившие в состав предыдущих SQL Server 2012 с пакетом обновления 1 выпуска исправлений. Мы рекомендуем рассмотреть применение последнего выпуска исправления, содержащего это исправление. Для получения дополнительных сведений щелкните следующий номер статьи, чтобы перейти к статье базы знаний Майкрософт:

2772858 SQL Server 2012 выполняется построение, выпущенных после выпуска SQL Server 2012 Пакет обновления 1

Статус

Корпорация Майкрософт подтверждает, что это проблема продуктов Майкрософт, перечисленных в разделе «Относится к».

Дополнительные сведения

Чтобы воспроизвести данную проблему, выполните следующие инструкции Transact-SQL в SQL Server 2012:

DECLARE @i INT

IF object_id(‘tempdb..#temptable’) IS NOT NULL
DROP TABLE #temptable

CREATE TABLE #temptable (id INT)
INSERT INTO #temptable VALUES (1),(2),(3);

IF year(getdate())=2012 SELECT @i=(SELECT COUNT(*) AS nr FROM #temptable);
BEGIN TRY
SELECT ‘message’
END TRY

BEGIN CATCH
SELECT ERROR_MESSAGE()
END CATCH

Временное решение

Чтобы обойти эту проблему, добавьте инструкции BEGIN и END IF условие.

Ссылки

Дополнительные сведения о добавочных модель обслуживания для SQL Server щелкните следующий номер статьи, чтобы перейти к статье базы знаний Майкрософт:

935897 добавочных модель обслуживания доступна из группы SQL Server для предоставления исправления для проблем, о которых сообщалось вДополнительные сведения о схеме именования для обновления SQL Server щелкните следующий номер статьи, чтобы перейти к статье базы знаний Майкрософт:

Пакеты обновлений схемы именования 822499 для программного обеспечения Microsoft SQL ServerДополнительные сведения о терминологии обновления программного обеспечения щелкните следующий номер статьи, чтобы перейти к статье базы знаний Майкрософт:

Описание 824684 Стандартные термины, используемые при описании обновлений программных продуктов Майкрософт

Нужна дополнительная помощь?

Нужны дополнительные параметры?

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

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

   mogul

05.07.08 — 12:08

Добрый день!

Занимаюсь переносом данных из 77 в 81 с помощью конвертации данных. И все бы хорошо, но столкнулся с проблемой:

после загрузки объекта и xml-файла программа (81) вылетает с сообщением «Ошибка SQL: неверный синтаксис».

Ошибка возникает где-то между событиями «ПередЗаписью» (эта процедура еще выполняется) и «ПриЗаписи» (а в эту уже не доходим) — смотрел в режиме отладки. Реквизиты объекта, при этом, переносятся нормально.

Тестирование и исправление БД результатов не дало.

В чем может быть причина такой беды?

   ТелепатБот

1 — 05.07.08 — 12:08

   eddy_n

2 — 05.07.08 — 22:31

Я не имею ничего против КД — мощная вещь, хотя не доработана как нужно до конца, и я ей тоже пользуюсь, но мне досталась для переноса такая Торговля 7.7, что логику проше было написать самому с выгрузкой в dbf. Может и тебе коней на переправе поменять?

   vde69

3 — 05.07.08 — 22:45

(2) а я вообще КД не люблю… для типовых — да, но там в нее вообще не надо лезть…

а переделки — там там 30% кода вообще никто не знает зачем и КОГДА было сделано… там переносить индивидуально надо, мне проще по ole все делать

   eddy_n

4 — 06.07.08 — 01:31

(3) В КД лезть надо даже для типовых, когда, например, нужно изменить условия поиска объекта в базе-приёмнике (вместо кода — по наименованию или наоборот или ещё какую-нибудь «мелочёвку» при загрузке менять).

   mogul

5 — 06.07.08 — 13:51

Не буду писать про свое отношение в КД…

Тем более, что, по моему мнению, дело вовсе не в ней — ошибка возникает при записи, где-то между «ПередЗаписью» и «ПриЗаписи».

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

Вот возможные причины возникновения этой ошибки меня и интересуют, а вовсе не комментарии про КД.

Спасибо.

   kitt

6 — 06.07.08 — 13:57

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

   mogul

7 — 06.07.08 — 14:10

(6) Я ж пишу — ошибка возникает между процедурами «ПередЗаписью» (она отрабатывается нормально) и «ПриЗаписи» (в эту процедуру вообще не попадает), т.е. где-то во внутренностях платформы. А уж что там за код у создателей 81, я понятия не имею.

   Aleksey_3

8 — 06.07.08 — 15:23

Правила переноса брал типовые? Небось еще старые от версии 8.0. Вот и получил.
В 8.1 изменился синтаксис вызова процедур, поэтому ищи правила под 8.1, или пиши сам.

   mogul

9 — 06.07.08 — 15:59

(8) Правила переноса самописные, рабочие.

   kitt

10 — 06.07.08 — 16:55

(7) может тебя это удивит, но между процедурами «ПередЗаписью» и «ПриЗаписи» есть много интересных строчек кода. Ты можешь в отладчике пройтись до той конкретной строчки на которой выскакивает ошибка? Если можешь так выложи кусок кода где это происходит, опиши контекст, переменные, какой конкретно объект у тебя там грузиться. Если не можешь, то так и скажи — не могу.

   mogul

11 — 06.07.08 — 17:02

(10) какие, интересно, строчки кода находятся между этими процедурами, если документ не проводится?

В отладчике проходился, а как же.

Процедура ПередЗаписью()

 // обДокументПередЗаписью(ЭтотОбъект) — специально все закомментил

 ф=1;

КонецПроцедуры

Процедура ОбработкаПроведения()

 // нет никакой обработки!

КонецПроцедуры

Процедура ПриЗаписи()

 // обДокументПриЗаписи(ЭтотОбъект) — специально все закомментил

КонецПроцецуры

Ставлю точку останова на строчку «ф=1», далее жму F10, попадаю на строчку «КонецПроцедуры», еще раз жму F10 — и привет, ошибка.

   BabySG

12 — 06.07.08 — 17:25

RLS посмотри

   mogul

13 — 07.07.08 — 11:03

(12) Спасибо за наводку, об этом я не подумал. Одно «но» — нет у меня RLS.

  

mogul

14 — 08.07.08 — 12:57

up

General Setting

This is a weird question and I am sorry about that. I actually spent quite some time searching and analyzing our code. We have a job calling a stored procedure which selects some data and then calls other stored procedures (some which names are retrieved using the select-statements, since they might vary). It calls about 20 different of these stored procedures about 10’000 times (summed up the different calls), just varying the parameters. These stored procedures retrieve some data and then inserts the data into our databse.

Version of SQL-Server

This worked fine in Microsoft SQL-Server 2005, but since a little while we upgraded to SQL-Server 2012 (11.0.3000.0) and this problem seems to started occurring since then, or we simply were not aware of it before.

Error

So we get this error every time we execute it:

Executed as user: #DATABASEUSER_RMV_FOR_STACKOVERFLOW. Incorrect syntax near ')'. 
[SQLSTATE 42000] (Error 102)  Incorrect syntax near ')'. 
[SQLSTATE 42000] (Error 102)  Incorrect syntax near ')'. 
[SQLSTATE 42000] (Error 102)  Incorrect syntax near ')'. 
[SQLSTATE 42000] (Error 102)  Incorrect syntax near ')'. 
[SQLSTATE 42000] (Error 102)  Incorrect syntax near ')'. 
[SQLSTATE 42000] (Error 102)  Incorrect syntax near ')'. 
[SQLSTATE 42000] (Error 102)  Incorrect syntax near ')'. 
[SQLSTATE 42000] (Error 102)  Incorrect syntax near ')'. 
[SQLSTATE 42000] (Error 102)  Incorrect syntax near ')'. 
[SQLSTATE 42000] (Error 102).  The step failed.

I know this is very little information, but our scripts are pretty big and I would like to ask what some of you would to to figure out the problem.

What I did so far

I looked at the scripts, did some dry runs (b/c the entire script runs for about an hour… (it’s a nightly job)). The dry runs worked fine. Also we hardly have opening brackets, and they always close. As soon as it retrieves data, after an hour of running it ‘crashes’ with this error…

So what I did:

  • Dry runs (without actually loading the data but calling most of the stored procedures) — ok, success
  • Called the main-store-procedure directly (not as job) — did not work either
  • Read through the code searched for bracket-errors — ok, no bracket errors found
  • Runned with different users: db-admin, my user — did not work either
  • Search through Google/Stackoverflow/a littlbe bit through stackexchange in general

Questions

It looks like everything the script has to do, is done correctly and completely, so we do not understand why it does not return ‘success’ and throws this error message at us.

I could imagine that there might be a field it retrieves which contains an escape character… would that make sense?

Could I set like a universal breakpoint, that the execution of the script would break as soon as this ‘error’ occurs and show me what the data is causing this error… like debugging code in visual studio?

So my main question is: Could you please give me a hint/help how to approach this error in the best way? What I should do?


Job

EXEC MY_SCHEME.dbo.MY_STOREDPROCEDURE_MAIN

MY_STOREDPROCEDURE_MAIN

SET NOCOUNT ON;

-- Insert statements for procedure here
DECLARE @userId INT
DECLARE @fullHistory BIT

SELECT @userId = userId
FROM MY_SCHEME.dbo.USERS
WHERE loginname = 'SOME_NAME'

SET @fullHistory = 0

EXECUTE MY_SCHEME.dbo.spStartMyNightlyJob @userId=@userId, @processFullHistory=@fullHistory

spStartMyNightlyJob

PROCEDURE [dbo].[spStartMyNightlyJob]
    @userId INT,
    @processFullHistory BIT
AS
BEGIN
    SET NOCOUNT ON

    DECLARE @logReport VARCHAR(255)
    SET @logReport = 'NightlyJob'

    INSERT INTO TEMP_LOGREPORT (text, report) VALUES('=======================================================================================================', @logReport)
    INSERT INTO TEMP_LOGREPORT (text, report) VALUES('NightlyJob started at ' + CAST(GETDATE() AS VARCHAR), @logReport)
    INSERT INTO TEMP_LOGREPORT (text, report) VALUES('=======================================================================================================', @logReport)

    DECLARE taskCursor CURSOR LOCAL FAST_FORWARD READ_ONLY FOR 
        SELECT
            r.taskId, link.Id, i.Description, link.externalId, rdef.name, rdir.fromDB, rdir.toDB,
            rdef.procedureName, rfs.fillStrategyId, rp.parameterId
        FROM MY_TASK r
        LEFT OUTER JOIN some_table_1 link
        ON r.LinkId = link.LinkId
        LEFT OUTER JOIN some_table_2 i
        ON link.Id = i.Id
        LEFT OUTER JOIN some_table_3_TASK_DEFINITION rdef
        ON r.taskDefinitionId = rdef.taskDefinitionId
        LEFT OUTER JOIN some_table_4_TASK_DIRECTION rdir
        ON rdef.directionId = rdir.directionId
        LEFT OUTER JOIN some_table_5_FILL_STRATEGY rfs
        ON rdef.fillStrategyId = rfs.fillStrategyId
        LEFT OUTER JOIN some_table_6_PARAMETER rp
        ON rdef.parameterId = rp.parameterId
        WHERE r.active = 1
        AND rdef.taskDefinitionId NOT LIKE 17


    DECLARE @taskId INT
    DECLARE @someOtherId INT
    DECLARE @someOtherName VARCHAR(255)
    DECLARE @externalSomeOtherId INT
    DECLARE @taskName VARCHAR(50)
    DECLARE @fromDB VARCHAR(50)
    DECLARE @toDB VARCHAR(50)
    DECLARE @storedProcedure VARCHAR(100)
    DECLARE @fillStrategyId INT
    DECLARE @parameterId INT

    OPEN taskCursor
    FETCH NEXT FROM taskCursor
    INTO
        @taskId, @someOtherId , @someOtherName , @externalSomeOtherId , @taskName, @fromDB, @toDB, @storedProcedure,
        @fillStrategyId, @parameterId

    WHILE @@FETCH_STATUS = 0 BEGIN
        INSERT INTO TEMP_LOGREPORT (text, report) VALUES('-------------------------------------------------------------------------------------------------------', @logReport)
        INSERT INTO TEMP_LOGREPORT (text, report) VALUES('Performing task: ' + @taskName, @logReport)
        INSERT INTO TEMP_LOGREPORT (text, report) VALUES('Nightly Job between: ' + @fromDB + ' -> ' + @toDB, @logReport)
        INSERT INTO TEMP_LOGREPORT (text, report) VALUES('Executive procedure: ' + @storedProcedure, @logReport)
        INSERT INTO TEMP_LOGREPORT (text, report) VALUES('Involved : ' + @someOtherName + ' (' + CAST(@someOtherId AS VARCHAR) + ')', @logReport)

        EXECUTE @storedProcedure @someOtherId , @externalSomeOtherId , @fillStrategyId, @parameterId, @userId, @processFullHistory

        INSERT INTO TEMP_LOGREPORT (text, report) VALUES('', @logReport)

        SET @taskId = NULL
        SET @someOtherId = NULL
        SET @someOtherName = NULL
        SET @externalSomeOtherId = NULL
        SET @taskName = NULL
        SET @fromDB = NULL
        SET @toDB = NULL
        SET @storedProcedure = NULL
        SET @fillStrategyId = NULL
        SET @parameterId = NULL

        FETCH NEXT FROM taskCursor
        INTO
            @taskId, @taskId , @someOtherName , @externalSomeOtherId , @taskName, @fromDB, @toDB, @storedProcedure,
            @fillStrategyId, @parameterId
    END
    CLOSE taskCursor
    DEALLOCATE taskCursor

    INSERT INTO TEMP_LOGREPORT (text, report) VALUES('=======================================================================================================', @logReport)
    INSERT INTO TEMP_LOGREPORT (text, report) VALUES('NightlyJob finished at ' + CAST(GETDATE() AS VARCHAR), @logReport)
    INSERT INTO TEMP_LOGREPORT (text, report) VALUES('=======================================================================================================', @logReport)
    RETURN 0
END

After this it opens up to about 15 different stored procedures, depending which tasks are ‘defined’ every evening..

If I comment-out the actual execution of it

EXECUTE @storedProcedure @someOtherId , @externalSomeOtherId , @fillStrategyId, @parameterId, @userId, @processFullHistory

then it completes without error.

Thanks already for looking at my question ;-)

Есть следующий запрос (на самом деле он больше, но я сократил):

INSERT INTO DBName.[ТСГрафик] 
                        ([Код], [Код КА], [Время прибытия]) VALUES (37, '978475', '22:30') ON DUPLICATE KEY UPDATE [Код] = VALUES([Код), [Код КА] = VALUES([Код КА]), [Время прибытия] = VALUES([Время прибытия]);

Выдает сообщение «Неправильный синтаксис около ключевого слова ON».
Нужно сделать массовый Update. Подскажите что не так с запросом?

задан 12 мар 2020 в 19:56

Сергей Татевосян's user avatar

4

В SQL, не в расширениях синтаксиса от разных СУБД, а именно в стандарте SQL нет такого синтаксиса. Стандартный механизм — MERGE.

Вот ссылка на документацию по MERGE в реализации от Microsoft: https://docs.microsoft.com/ru-ru/sql/t-sql/statements/merge-transact-sql?view=sql-server-ver15

MERGE INTO DBName.[ТСГрафик] AS A
USING (
  SELECT 37 AS [Код], '978475' AS [Код КА], '22:30' AS [Время прибытия]
) AS B
ON A.[Код] = B.[Код]
WHEN MATCHED THEN UPDATE SET
  [Код КА] = B.[Код КА],
  [Время прибытия] = B.[Время прибытия]
WHEN NOT MATCHED THEN INSERT ([Код], [Код КА], [Время прибытия])
  VALUES (B.[Код], B.[Код КА], B.[Время прибытия])

ответ дан 13 мар 2020 в 5:57

Герман Борисов's user avatar

Герман БорисовГерман Борисов

10.3k13 серебряных знаков37 бронзовых знаков

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
USE [Транспортное агентство]
GO
 
INSERT INTO [dbo].[Транспортное средство]
           ([Инвентарный номер средства]
           ,[Наименование]
           ,[Тип средства]
           ,[Тип грузов]
           ,[Государственный номер]
           ,[Дата выпуска]
           ,[Пробег]
           ,[Грузоподъемность]
           ,[Техническое состояние])
     VALUES
                   (1,'Камаз','Тягач','Электронная техника',56957,2005,100000,'20 тон','Нормальное')
           (2,'МАЗ','Тягач','Уголь',56555,2004,150000,'25 тон','Нормальное')
           (3,'MAN','Тягач','Трубы',56956,2010,2000,'24 тон','Нормальное')
           (4,'DAF','Тягач','Топливо',21957,2011,2000,'25 тон','Нормальное')
           (5,'Камаз','Тягач','Электронная техника',57,2005,100000,'20 тон','Нормальное')
           (6,'Камаз','Тягач','Продукты',78957,2005,100000,'20 тон','Нормальное')
           (7,'Камаз','Тягач','Срой материалы',45657,2005,100000,'20 тон','Нормальное')
           (8,'МАЗ','Тягач','Уголь',56933,2004,150000,'25 тон','Нормальное')
           (9,'МАЗ','Тягач','Продукты',56567,2004,15000,'25 тон','Нормальное')
           (10,'MAN','Тягач','Электронная техника',58957,2010,2000,'24 тон','Нормальное')
           (11,'MAN','Тягач','Электронная техника',54557,2010,2000,'24 тон','Нормальное')

Понравилась статья? Поделить с друзьями:
  • Ошибка sql при восстановлении 3154
  • Ошибка sql не удалось выделить место для объекта
  • Ошибка spn 516249 fmi 1 sa1
  • Ошибка sql не удается загрузить указанный драйвер
  • Ошибка sql переполнение поля ошибка sql переполнение поля