У меня есть два SQL-сервера: Server1
и Server2
. Серверы связаны, а пользователь, связывающий два сервера, - db_owner.SQL Server: Вставить данные с Linked Server
Когда я в Server1
и написать следующее:
INSERT INTO Server2.dbname.dbo.ContractPermission (ContractNo, UsrCode, Extra)
VALUES ('29977', 'xxx', 1)
он работает как шарм!
Но когда я на Server1
и пишу:
INSERT INTO Server2.dbname.dbo.ContractPermission
SELECT
[ContractNo]
,'xxx'
,[Extra]
FROM
Server2.dbname.dbo.ContractPermission
WHERE
UsrCode = 'yyy'
это не работает. Возвращается код ошибки:
Msg 213, Level 16, State 1, Line 1
Имя столбца или количество предоставленных значений не соответствует определению таблицы.
Забавно, что если я подключаюсь к Server2 и использую тот же самый код, он работает!
Итак, моя путаница: почему это не работает с Server1, когда я доказал, что могу вставлять элементы в таблице из Server1. И я также доказал, что SQL работает, когда я на сервере2.
Существует небольшая разница в версиях SQL Server:
- Сервер1 является SQL Server 2012 - 11.0.5532.0 (X64)
- Сервер2 является SQL Server 2012 - 11.0.5058.0 (X64)
Это не большая проблема, так как я всегда могу выполнить ее с Server2. Мне просто интересно, почему это не работает с Server1
.
Скорее всего, ваш 'ContractPermission' таблица имеет больше, чем просто эти три колонки, которые вы предоставляете данные в вашем' SELECT' во втором примере. Вот почему вы должны ** всегда ** явно определять ** список столбцов ** в ваших операциях 'INSERT' –
Да, вы правы! И t -clausen.dk ниже также прав. Но все же странно, что он работает, когда выполняется непосредственно на сервере Server2! Единственный дополнительный столбец в таблице - это поле идентификатора, для которого установлено значение «Да». – olf