Главная » Error » Near name syntax error

Near name syntax error

Симптомы

Если для параметра quoted_идентификатор SQL Server установлено значение Off, вы можете получить следующую ошибку:

Ошибка выполнения «-2147217900 (80040e14)»:
строка 1: синтаксическая ошибка рядом с «имя таблицы»

Эта ошибка возникает при использовании клиентских курсоров с поставщиком Microsoft OLE DB для SQL Server (SQLOLEDB). Ошибка возникает в методе Update набора записей ActiveX Data Objects (ADO) и может возникать в методе AddNew.

Причина

При использовании клиентских курсоров ADO при вызове метода AddNew или Update набора записей ADO поставщик OLE DB подготавливает оператор SQL для отправки на SQL Server.

Поставщик Microsoft OLE DB для SQL Server автоматически заключает в кавычки идентификаторы в методе Update набора записей ADO и может указывать идентификаторы в методе AddNew. Идентификаторы включают имена таблиц и имена полей.

Например, обновление таблицы Titles в базе данных Pubs с помощью следующего кода:

MyADORecordet.Update

Предыдущее будет подготовлено аналогично следующему:

UPDATE "titles" SET "title"='Hello World' WHERE "title_id"='3'

Обратите внимание, что имя таблицы заключено в кавычки, «titles», и что каждое имя поля заключено в кавычки, «title», «title_id» и т. д.

Если для параметра Quoted_Identifier SQL Server установлено значение Off, SQL Server не будет распознавать имена таблиц и имена полей, заключенные в кавычки.

Возникает ошибка «Синтаксическая ошибка рядом с именем таблицы».

Разрешение

Если у вас нет причин отключать идентификаторы в кавычках, снова включите их, и приведенное выше сообщение об ошибке больше не будет отображаться.

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

  • Используйте серверные курсоры.

    Например, перед открытием объекта ADO Connection с именем cn используйте следующий синтаксис:

    cn.CursorLocation = adUseServer

    -или же-

  • Используйте Microsoft OLE DB Provider для драйверов ODBC с драйвером ODBC Microsoft SQL Server.

    По умолчанию драйвер ODBC для SQL Server заключает идентификаторы в кавычки. Однако вы можете настроить драйвер ODBC SQL Server для подготовки операторов SQL без идентификаторов в кавычках.

    ПРИМЕЧАНИЕ. Необходимо использовать драйвер ODBC для SQL Server версии 2.65.0240, поставляемый с пакетом обновления 2 для SQL Server 6.5 или более поздней версии драйвера. Более ранние драйверы ODBC для SQL Server не имеют этой возможности.

    1. Добавьте «QuotedID=No» в строку подключения ODBC.

      -или же-

    2. Снимите флажок Использовать идентификаторы в кавычках ANSI в конфигурации имени источника данных (DSN) Microsoft SQL Server.

      1. Откройте Администратор ODBC.

      2. Откройте пользовательский DSN или системный DSN, который вы используете для подключения к базе данных SQL Server.

      3. Нажимайте «Далее», пока не появится диалоговое окно «Использовать идентификаторы в кавычках ANSI».

      4. Снимите флажок «Использовать идентификаторы в кавычках ANSI».

      5. Нажмите Готово.

ПРИМЕЧАНИЕ. Примеры обоих обходных путей приведены в разделе «Дополнительная информация».

Положение дел

Такое поведение является особенностью.

Дополнительная информация

ADO и базовый поставщик OLE DB не знают о параметре SQL Server для quoted_identifier, установленном операторами Transact SQL (T-SQL):

  • Отключить quoted_идентификатор

    -или-

  • Установить quoted_идентификатор на

Поведение идентификатора ADO в кавычках на стороне клиента основано на базовом поставщике OLE DB. Поэтому, чтобы использовать клиентские курсоры, вы должны настроить поставщика так, чтобы он заключал в кавычки или не заключал в кавычки идентификаторы, в зависимости от параметра SQL Server для quoted_identifier.

Поставщик OLE DB для SQL Server автоматически заключает идентификаторы в кавычки, чтобы гарантировать, что если идентификатор содержит специальный символ, он будет заключен в кавычки, как того требует SQL Server. Обратите внимание, что идентификатор не обязательно должен содержать специальный символ. Это только возможность, которая заставляет поставщика OLE DB заключать идентификатор в кавычки. Поставщик OLE DB для SQL Server не имеет свойства, позволяющего явно указывать, следует или не следует заключать идентификаторы в кавычки.

Поставщик OLE DB для ODBC можно настроить для подготовки операторов SQL с кавычками или без кавычек вокруг идентификаторов. Он использует настройку драйвера ODBC для QuotedID, чтобы определить, заключать ли идентификаторы в кавычки. По этой причине вы можете включить параметр «QuotedID=Yes» или «QuotedID=No» в строку подключения ODBC или выбрать или снять флажок «Использовать идентификаторы в кавычках ANSI» в настройке DSN. Обратите внимание, что по умолчанию «QuotedID=Yes», ​​что указывает ODBC заключать идентификаторы в кавычки.

При использовании серверных курсоров ADO курсоры открываются на сервере. Поставщик OLE DB подготавливает T-SQL sp_cursoropen, sp_cursorfetch и соответствующие операторы курсора на стороне сервера вместо запросов действий.

Свойство “Чувствительность к кавычкам идентификатора” объекта ADO Connection показывает конфигурацию, которую поставщик использует для кавычек идентификаторов. Свойство «Чувствительность идентификатора в кавычках» доступно только для чтения и доступно только во время выполнения после открытия объекта Connection. Свойство «Чувствительность идентификатора в кавычках» доступно только для определенных поставщиков, включая поставщиков SQL Server и ODBC. Поскольку это свойство доступно только для чтения, вы не можете использовать свойство «Чувствительность идентификатора в кавычках», чтобы настроить поставщика на цитирование или не цитирование идентификаторов.

Доступное только для чтения свойство «Чувствительность идентификатора в кавычках» объекта «Соединение ADO» будет следующим:
8 — Когда поставщик настроен на цитирование идентификаторов.

Шаги для воспроизведения поведения

ПРИМЕЧАНИЕ. В следующих примерах кода замените имя сервера на имя сервера в строках подключения.

В этом примере используется база данных Pubs, поставляемая с SQL Server.

  1. Создайте пользовательский интерфейс:

    1. В Visual Basic создайте новый проект Standard .exe. Form1 создается по умолчанию.

    2. Добавьте кнопку Command в форму Form1.

  2. Установите ссылку на библиотеку объектов данных Microsoft ActiveX.

  3. Скопируйте и вставьте следующий код в событие Click команды Command1.

    Примечание. Прежде чем запускать этот код, необходимо изменить идентификатор пользователя <имя пользователя> и пароль <надежный пароль> на правильные значения. Убедитесь, что у ID пользователя есть соответствующие разрешения для выполнения этой операции в базе данных.

    Dim strcn As String
    Dim cn As New ADODB.Connection
    Dim rs As New ADODB.Recordset

    strcn = "Provider=SQLOLEDB;User ID=<user name>;Password=<strong password>;Initial Catalog=Pubs;"
    strcn = strcn & "Data Source=servername"

    cn.ConnectionString = strcn

    'Error occurs with Client-side cursors.
    cn.CursorLocation = adUseClient

    cn.Open

    'Instruct SQL Server to turn off Quoted_Identifier.
    cn.Execute "set quoted_identifier off"

    rs.Open "select * from titles", cn, adOpenKeyset, adLockOptimistic
    rs(1).Value = "Hello World"

    'Error occurs on this line.
    rs.Update

    rs.Close
    Set rs = Nothing
    cn.Close
    Set cn = Nothing
  4. Протестируйте приложение следующим образом:

    1. При необходимости запустите на сервере программу SQL Server SQLTrace. SQLTrace — это отдельная программа в группе SQL Server 6.5. SQLTrace позволяет просматривать операторы SQL, поступающие на SQL Server.

    2. В Visual Basic нажатие кнопки Command во время выполнения вызывает следующую ошибку:

      Run-time error '-2147217900 (80040e14)':
      Line 1: Syntax error near 'tablename'
    3. Если вы используете SQLTrace, вы можете изучить оператор T-SQL UPDATE, созданный поставщиком OLE DB для SQL Server. Обратите внимание, что имена таблиц и имена полей заключаются в кавычки.

Примеры обходных путей

Использование поставщика OLE DB для драйверов ODBC (MSDASQL)

Необходимо использовать драйвер ODBC для SQL Server версии 2.65.0240, который поставляется с пакетом обновления 2 для SQL Server 6.5 или более поздней версии драйвера.

Измените строку подключения в предыдущем примере на следующую.

Примечание. Прежде чем запускать этот код, необходимо изменить UID <username> и PWD <strong password> на правильные значения. Убедитесь, что у UID есть соответствующие разрешения для выполнения этой операции в базе данных.
strcn = “Provider=MSDASQL;драйвер=SQL Server;UID=<имя пользователя>;PWD=<надежный пароль>;”
strcn = strcn & “DATABASE=pubs;SERVER=servername;QuotedId=No”

Использование серверных курсоров

Измените cn.CursorLocation в предыдущем примере на следующее:
cn.CursorLocation = adUseServer
Если вы используете программу SQL Server SQLTrace, вы можете проверить инструкции T-SQL sp_cursor, которые создает поставщик OLE DB.

Эта ошибка SQL обычно означает, что где-то в запросе присутствует недопустимый синтаксис.
Некоторые распространенные примеры:

  • Использование специфичного для базы данных SQL для неправильной базы данных (например, BigQuery поддерживает DATE_ADD, а Redshift поддерживает DATEADD)
  • Опечатка в SQL (отсутствует запятая, слово с ошибкой и т.д.)
  • Отсутствует предложение sql (пропущено из, присоединиться, выбрать и т. д.)
  • Объект не существует в базе данных или недоступен из текущего запроса (например, ссылка на orders.id, когда в текущем запросе нет присоединенной таблицы заказов и т. д.)

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

Сообщение об ошибке

SQL ERROR: syntax error at or near

Исправление проблем

Как правило, это должен быть первый шаг к устранению любой синтаксической ошибки SQL в большом запросе: итеративно комментируйте блоки SQL, чтобы сузить область проблемы.

СОВЕТ: Чтобы упростить этот процесс, измените предложение group by, чтобы использовать ссылки на позиции,
например:  group by 1,2,3,4,5 instead of group by orders.status, orders.date, to_char(...)...
а также разделите предложения where и have на несколько строк.

Так, например, скажем, у нас есть следующий запрос:

play_arrow

WITH cte AS (
select id, status, sales_amountfrom orders
)
select status, foo.date, sum(cte.sales_amount), count(*) from cte
join foo on cte.date = foo.date
group by status, foo.date
order by 3 desc

Мы могли бы начать с запуска только части CTE:

play_arrow

-- WITH cte AS (
select id, status, sales_amountfrom orders
-- )
-- select status, foo.date, sum(cte.sales_amount), count(*)
-- from cte
-- join foo on cte.date = foo.date
-- group by 1, 2
-- order by 3 desc

Затем удалите агрегаты и части, связанные с ними.

play_arrow

WITH cte AS (
    select id, status, sales_amountfrom orders
)
select status, foo.date, -- sum(cte.sales_amount), count(*)
from cte
join foo on cte.date = foo.date
-- group by 1, 2
-- order by 3 desc

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

  • Функции поиска и синтаксис  . Если запрос достаточно мал или мы достаточно сузили область до 1, поищите в Google все функции, используемые в запросе, и убедитесь, что они существуют и используются правильно.

  • Убедитесь, что все объекты существуют  . Убедитесь, что вы присоединили все таблицы, используемые в предложении select, where и have, и что эти таблицы существуют в базе данных. После того, как мы сузили список с 1, также проверьте, существует ли каждый столбец в указанной таблице.

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Загрузка...

Добавить комментарий

Ваш адрес email не будет опубликован.

Adblock
detector