SQL Server вставляет или запрашивает между серверами столбец ingnores в таблице, начинающийся с цифры?

#sql-server

#sql-сервер

Вопрос:

Я пытаюсь выполнить запрос между двумя серверами, которые имеют идентичные таблицы (используется один и тот же оператор create для обоих). Когда я пытаюсь вставить результаты с сервера A на сервер B, я получаю сообщение об ошибке, указывающее «Имя столбца или количество предоставленных значений не соответствует определению таблицы.«

Запрос выполняется на сервере A

 Insert into ServerB.Database1.dbo.Table1
Select *
from Table1
  

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

Когда я запускаю это на сервере:

 Select *
from ServerB.Database1.dbo.Table1
  

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

Комментарии:

1. Вы не должны называть объекты начальной цифрой, поскольку это не соответствует правилам для стандартных идентификаторов объектов, и вам всегда приходится разделять имя объекта. Удивленный SQL Server, однако, не справляется с этим автоматически. Что произойдет, если вы запросите столбец явно, а не используете * ?

2. Я знаю, что это не лучшая практика, но в данном случае я работал с предоставленными базами данных. Когда я пытаюсь запросить столбец явно, вы получаете сообщение об ошибке с недопустимым именем столбца . Странно, что вы можете использовать его внутри сервера, но не на разных серверах.

3. заключите столбец в квадратные скобки… [1col]

4. select * from information_schema.columns where table_name = 'Table1' какие столбцы вы получаете обратно

5. Столбец отображается при выполнении запроса выше, вот почему это действительно странно. Возможно, проблема в том, как настроены серверы…

Ответ №1:

Мне тоже интересно, как выполняется сортировка, но на самом деле ответ заключается в том, чтобы заключить имена объектов в квадратные скобки. т. Е. ВЫБРАТЬ [1col], [2col], [etc] ИЗ [1database].[2owner].[3table]. Таким образом SQL с распознает каждый из них как имя объекта, а не как функцию.

Еще одна вещь, которую следует иметь в виду, это не использовать splat (*) в вашем операторе select, это имеет свою собственную потенциальную проблему. Например, вы могли столкнуться с ошибкой при вставке, если структура table1 сервера была изменена, а таблица ServerB осталась прежней.