我正在编写一个应该在一堆服务器上运行的脚本,并从中选择一堆数据,包括本地服务器.SELECT我需要的数据所需的SQL非常复杂,所以我正在编写一种特殊的视图,并使用OPENQUERY语句来获取数据,所以最终我最终循环遍历这样的语句:
exec('INSERT INTO tabl SELECT * FROM OPENQUERY(@Server, @AdHocView)')
Run Code Online (Sandbox Code Playgroud)
但是,我听说在本地服务器上使用OPENQUERY是不受欢迎的.有人可以详细说明原因吗?
我有一个C#程序,用于OPENQUERY()从链接服务器中进行选择.此传递查询接受参数.为了防止SQL注入,我想以类似的方式传递此参数SqlCommand.Parameters.AddWithValue,但OPENQUERY()不接受变量.
到目前为止,我一直在使用SqlCommand将参数传递给针对SQL Server中的表运行的查询.但是我还需要访问Oracle的链接服务器.是否有任何方法可以添加此参数而不将其连接为字符串?
string query = "SELECT * FROM OPENQUERY(linked_server,
'SELECT * FROM User.Table WHERE col1 = @parameter1 ')";
Run Code Online (Sandbox Code Playgroud)
编辑:我没有权限在远程Oracle服务器上创建存储过程.因此,对存储过程执行Sp_executesql似乎不是我的直接答案.
我有SQL Server 2008与链接的Sybase服务器,我试图使用OPENQUERY在Sybase服务器上执行存储过程.如果我有一个不带参数的存储过程,它就会成功.如果我有一个带参数的存储过程则失败.我甚至尝试过一个非常基本的存储过程,只接受一个仍然失败的int.以下是我使用的语法:
select * from
OPENQUERY([LINKSERVER],'exec database.user.my_stored_proc ''AT'',''XXXX%'',''1111'',1')
Run Code Online (Sandbox Code Playgroud)
消息7357,级别16,状态2,行3无法处理对象"exec database.user.my_stored_proc'AT','XXXX%','1111',1".链接服务器"LINKSERVER"的OLE DB提供程序"ASEOLEDB"表示该对象没有列,或者当前用户没有该对象的权限.
由于proc将在没有参数的情况下执行得很好,我认为这不是一个权限问题.
我有一个Oracle 11g XE数据库,我想将其转移到SQL Server Express 2005中.
起初我以为我只是在Oracle中生成表作为SQL,操纵数据格式,并在SQL Server中运行查询.这适用于小型表,但我有几个表有几十万行,有些表有数百万行,所以这个解决方案不起作用.
然后我创建了一个包含以下内容的TNS文件:
OracleTnsName =
(
DESCRIPTION=
(
ADDRESS = (PROTOCOL=TCP)(HOST=localhost)(PORT=1521)
)
(
CONNECT_DATA = (SERVICE_NAME=XE)
)
)
Run Code Online (Sandbox Code Playgroud)
我按照我在别处找到的关于如何生成ODBC连接的指令,并且'测试连接'成功了.
然后我运行这些命令在MS SQL中创建链接服务器:
EXEC sp_addlinkedserver
@server = 'OracleLinkServer'
,@srvproduct = 'OracleTnsName'
,@provider = 'MSDASQL'
,@datasrc = 'OracleTnsName'
EXEC sp_addlinkedsrvlogin
@rmtsrvname = 'OracleLinkServer'
,@useself = 'False'
,@locallogin = NULL
,@rmtuser = 'user'
,@rmtpassword = 'password'
Run Code Online (Sandbox Code Playgroud)
现在我正在尝试使用openquery以下方法从SQL Server查询Oracle数据库中的表:
select * from openquery(OracleLinkServer, 'select * from oracleTable')
Run Code Online (Sandbox Code Playgroud)
但得到一个错误:
消息7399,级别16,状态1,行1
链接服务器"OracleLinkServer"的OLE DB提供程序"MSDASQL"报告错误.提供商未提供有关错误的任何信息.
消息7303,级别16,状态1,行1
无法为链接服务器"OracleLinkServer"初始化OLE DB提供程序"MSDASQL"的数据源对象.
当我检查链接服务器的属性,只需单击确定,我收到此错误:
我使用openquery语法从链接服务器读取数据.
SELECT * FROM OPENQUERY(LinkServer, 'SELECT * FROM Product')
Run Code Online (Sandbox Code Playgroud)
我想加入这个链接服务器表与Sql服务器表,以获得我的最终结果.现在,我有一个临时表.
SELECT *
INTO #Temp_Products
FROM OPENQUERY(TREPO, 'SELECT ID, Name FROM Products')
SELECT * FROM #TEMP_PRODUCTS A
INNER JOIN ORDERED_PRODUCTS B
ON A.ID = B.ID
Run Code Online (Sandbox Code Playgroud)
但是,由于链接服务器产品表包含大量记录,因此填充临时表需要一些时间.所以我认为不是拉动所有产品信息,如果我事先加入两个表,它可以提高性能.
可以这样做吗?有人可以帮忙吗?
使用TOAD直接针对Oracle 11运行时,以下查询有效工作(使用本机Oracle驱动程序)
select ... from ... where ...
and srvg_ocd in (
select ocd
from rptofc
where eff_endt = to_date('12/31/9999','mm/dd/yyyy')
and rgn_nm = 'Boston'
) ...
;
Run Code Online (Sandbox Code Playgroud)
如果从SQL Server 2008传递到同一个Oracle数据库,则完全相同的查询"never"将返回openquery().SQL Server使用Oracle Provider OLE DB驱动程序链接到Oracle数据库.
select * from openquery( servername, '
select ... from ... where ...
and srvg_ocd in (
select ocd
from rptofc
where eff_endt = to_date(''12/31/9999'',''mm/dd/yyyy'')
and rgn_nm = ''Boston''
) ...
');
Run Code Online (Sandbox Code Playgroud)
查询不会在合理的时间内返回,并且用户会终止查询.我不知道它最终会以正确的结果返回.
直接TOAD查询有效工作且openquery()版本"从不"返回的结果是可重现的.
对它的一个小修改openquery()给出了正确有效的结果:eff_endt改为trunc(eff_endt).
这很好,但似乎不应该有必要改变.
openquery() …
我目前正在审查一些在数据库上运行存储过程的作业。所有这些存储过程都连接到链接服务器。我对这个功能不太熟悉。我目前正在尝试确定为什么使用这些查询而不是普通查询,因为我正在运行的查询似乎正在提取数据。
我读到了这个,这是MSDN对openquery的解释。:
http://technet.microsoft.com/en-us/library/ms188427.aspx
我还读过这篇文章,这是一个 stackoverflow 链接,讨论为什么不在本地服务器上使用它。:
我的问题是,当存储过程需要链接服务器的嵌入式凭据时,您基本上只使用它吗?或者还有更多我不知道的使用 OpenQuery 的原因吗?
我有一个链接服务器,Remoteserver其中包含一个表,用于保存dir中的文件和文件夹名称
当我在远程服务器上时,我可以运行内置过程(xp_dirtree)并填充'files'表,但我需要做的是从执行此操作的本地SQL服务器运行查询:
[Files]表中删除所有记录Remoteserver插入来自存储过程的数据:
INSERT [Remoteserver].[dbo].[files] (subdirectory,depth,isfile)
EXEC master.sys.xp_dirtree '\\Fileserver\DBBackup',1,1;
Run Code Online (Sandbox Code Playgroud)选择"子目录"列
我尝试了一些使用openquery的东西,我可以选择现有的记录,但无法进行插入.
任何帮助表示赞赏.
我需要使用参数@PickedDate从链接服务器检索数据.如果我跳过@A和@B,查询工作正常,但由于缺少单引号,它总是返回错误.请指教,谢谢.
查询:
Declare @OPENQUERY nvarchar(500), @TSQL nvarchar(max), @LinkedServer nvarchar(20), @A varchar(5), @B varchar(5), @PickedDate varchar(8)
Set @PickedDate = '20150501'
Set @A = 'AAA'
Set @B = 'BBB'
Set @LinkedServer = 'LinkedServerName'
Set @OPENQUERY = 'Select * From Openquery('+ @LinkedServer + ','''
Set @TSQL = 'SELECT cases.casenum, user.username, code
From cases
Inner join user
On cases.casenum = user.user_id
Where cases.date_opened > DateAdd(day,1-datepart(dw,Convert(date,' + @PickedDate + ')), Convert(date,' + @PickedDate + '))
And cases.date_opened <= DateAdd(day,8-datepart(dw,Convert(date,' + @PickedDate + ')), Convert(date,' + …Run Code Online (Sandbox Code Playgroud) 我尝试过这段代码但仍然遇到以下错误,也许有人可以帮忙吗?
UPDATE a
SET a.MMDWNO = '21'
FROM OPENQUERY(NMIIFLIB,
'select * from MVXCDTANSN.MITMAS WHERE MMITTY = ''25''') a
Run Code Online (Sandbox Code Playgroud)
错误:
链接服务器"NMIIFLIB"的OLE DB提供程序"MSDASQL"返回消息"[IBM] [iSeries Access ODBC驱动程序] [DB2 UDB] SQL7008 - MVXCDTANSN中的MITMAS对操作无效."
消息7343,级别16,状态4,行1
链接服务器"NMIIFLIB"的OLE DB提供程序"MSDASQL"无法更新表"[MSDASQL]".
select语句工作正常,但是当我尝试更新时,我总是坚持这个.