我正在尝试从本地查询对远程表执行UPDATE操作。显然,我知道应该使用OPENROWSET,但我不知道该怎么做。

我知道您可以执行以下操作将其插入OPENROWSET:

 set @cadsql = convert(varchar(max),
  'insert into openrowset(''SQLOLEDB'','''+@cadcon+''','+@bd+'.ctoxtractor.lm_vehiculos) ' + char(13) +
  '           (cuenta,corporativo,economico,ctatipotractor,sctatipotractor,ultcambio,ciausu,usuario,estatusoper) ' + char(13) +
  'select 423,fv.vehic,fv.numeco,9802,0,getdate(),0,''ADMIN'',fv.estatusoper ' + char(13) +
  'from ficvehic fv ' + char(13) +
  'order by fv.vehic ')

 exec (@cadsql)


或者我可以做这样的选择:

SET @cadsql = 'SELECT * FROM OPENROWSET(''sqloledb'',''driver=sql server;server='+@server+';database='+ @database +';uid='+@user+';pwd='+@password+''',' +
'''SELECT Column1, column2,...
   FROM table'')'

INSERT INTO another_table
exec (@cadsql)


但是我还没有想出更新的解决方案。那可能吗?

提前致谢!

最佳答案

如果我正确理解了您的意图,这应该可以帮助您:

UPDATE target
SET
  target.column = query.value,
  ...
FROM OPENROWSET(
  'provider',
  'connection string',
  'SELECT columns FROM yourtable'
) AS target
INNER JOIN (
  your local query
) AS query
ON
  target.column = query.column
  AND ...
;


基本上,这与从查询更新本地表相同,只是使用OPENROWSET而不是FROM子句中的表名,并在UPDATE子句中指定其别名。

当然,远程查询应该是可更新的(例如,它应该从单个表返回结果),这一点也很重要,与使用OPENROWSET插入时可插入的查询相同。

08-25 18:01