2015-01-15 4 views
0

У меня есть два 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.

+1

Скорее всего, ваш 'ContractPermission' таблица имеет больше, чем просто эти три колонки, которые вы предоставляете данные в вашем' SELECT' во втором примере. Вот почему вы должны ** всегда ** явно определять ** список столбцов ** в ваших операциях 'INSERT' –

+0

Да, вы правы! И t -clausen.dk ниже также прав. Но все же странно, что он работает, когда выполняется непосредственно на сервере Server2! Единственный дополнительный столбец в таблице - это поле идентификатора, для которого установлено значение «Да». – olf

ответ

1

Вам не хватает столбцов, которые у вас были в первом примере.

Попробуйте это:

INSERT INTO Server2.dbname.dbo.ContractPermission 
    (ContractNo, UsrCode, Extra) 
SELECT 
    [ContractNo] 
    ,'xxx' 
    ,[Extra] 
FROM Server2.dbname.dbo.ContractPermission 
WHERE UsrCode = 'yyy' 
Смежные вопросы