更新到Openrowset SQL SERVER 2008

时间:2013-09-06 17:11:29

标签: sql-server-2008 sql-update openrowset

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

答案 0 :(得分: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进行插入。

答案 1 :(得分: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

答案 2 :(得分:1)

A.F.A.I.K。 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提供程序的用户名。

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

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

schema是指定对象的架构或对象所有者的名称。

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

query是发送给提供程序并由提供程序执行的字符串常量。

答案 3 :(得分:-1)

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

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

我会在工作的时候看看今天是否可以使用它。我有几个测试dbs,我可以玩..

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

HTH,

肯特