#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 осталась прежней.