5

我正在尝试从本地查询对远程表执行 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)

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

提前致谢!

4

4 回答 4

6

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

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 ...
;

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

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

于 2013-09-17T09:03:41.550 回答
2

这是语法:

OPENROWSET 
( { 'provider_name' , { 'datasource' ; 'user_id' ; 'password' 
   | 'provider_string' } 
   , {   [ catalog. ] [ schema. ] object 
       | 'query' 
     } 
   | BULK 'data_file' , 
       { FORMATFILE = 'format_file_path' [ <bulk_options> ]
       | SINGLE_BLOB | SINGLE_CLOB | SINGLE_NCLOB }
} ) 

<bulk_options> ::=
   [ , CODEPAGE = { 'ACP' | 'OEM' | 'RAW' | 'code_page' } ] 
   [ , ERRORFILE = 'file_name' ]
   [ , FIRSTROW = first_row ] 
   [ , LASTROW = last_row ] 
   [ , MAXERRORS = maximum_errors ] 
   [ , ROWS_PER_BATCH = rows_per_batch ]
   [ , ORDER ( { column [ ASC | DESC ] } [ ,...n ] ) [ UNIQUE ]

在这里你可以获得更多信息

http://technet.microsoft.com/es-es/library/ms190312.aspx

于 2013-09-17T14:43:11.263 回答
1

AFAIK OPENROWSET 函数也可以作为 INSERT、UPDATE 或 DELETE 语句的目标表引用,具体取决于 OLE DB 提供程序的功能。尽管查询可能返回多个结果集,但 OPENROWSET 只返回第一个。

仅当 DisallowAdhocAccess 注册表选项显式设置为 0 时,OPENROWSET 才能用于从 OLE DB 数据源访问远程数据。如果未设置此选项,则默认行为不允许即席访问。

OPENROWSET 不接受其参数的变量。

OPENROWSET 函数的语法:

OPENROWSET ( 'provider_name' 
    , { 'datasource' ; 'user_id' ; 'password'
        | 'provider_string' } 
    , { [ catalog. ] [ schema. ] object
        | 'query' }   )

provider_name 是一个字符串,它表示注册表中指定的 OLE DB 提供程序的友好名称。它没有默认值。

datasource 是一个字符串常量,对应于特定的 OLE DB 数据源。

userid 是一个字符串常量,它是传递给指定 OLE DB 提供程序的用户名。

密码是提供程序特定的连接字符串,它作为 DBPROP_INIT_PROVIDERSTRING 属性传入以初始化 OLE DB 提供程序。

catalog 是指定对象所在的目录或数据库的名称。

schema 是指定对象的模式或对象所有者的名称。

object 是唯一标识要操作的对象的对象名称。

query 是一个字符串常量,发送给提供者并由提供者执行。

于 2013-09-17T13:39:16.290 回答
-1

更新了..看看这里(最后一页)..我不知道这是否有效,但似乎合理..

http://www.sql-server-performance.com/forum/threads/how-to-update-using-openrowset.10275/

我会看看我今天工作时能不能得到这个工作..我有几个可以玩的测试数据库..

update t set t.col_Name='1' FROM OPENROWSET('SQLOLEDB','ServerName';'UserName';'Pwd','select * from TableName') t

高温下,

肯特

于 2013-09-10T01:36:01.443 回答