我正在尝试从本地查询对远程表执行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)
但是我没有提出更新的解决方案。这可能吗?
提前致谢!
答案 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 ]
在这里你可以获得更多信息
答案 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,
肯特