标签: openquery

为什么在本地服务器上使用OPENQUERY不好?

我正在编写一个应该在一堆服务器上运行的脚本,并从中选择一堆数据,包括本地服务器.SELECT我需要的数据所需的SQL非常复杂,所以我正在编写一种特殊的视图,并使用OPENQUERY语句来获取数据,所以最终我最终循环遍历这样的语句:

exec('INSERT INTO tabl SELECT * FROM OPENQUERY(@Server, @AdHocView)')
Run Code Online (Sandbox Code Playgroud)

但是,我听说在本地服务器上使用OPENQUERY是不受欢迎的.有人可以详细说明原因吗?

sql t-sql sql-server sql-server-2005 openquery

6
推荐指数
1
解决办法
2万
查看次数

如何将参数传递给c#中的传递查询?

我有一个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似乎不是我的直接答案.

c# sql-server oracle openquery

6
推荐指数
1
解决办法
805
查看次数

使用OPENQUERY执行存储过程

我有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将在没有参数的情况下执行得很好,我认为这不是一个权限问题.

sql t-sql sql-server sybase openquery

5
推荐指数
2
解决办法
6万
查看次数

从SQL Server查询Oracle数据库

我有一个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"的数据源对象.

当我检查链接服务器的属性,只需单击确定,我收到此错误:

标题:Microsoft SQL …

sql-server oracle oledb tnsnames openquery

5
推荐指数
1
解决办法
5万
查看次数

如何在使用openquery时加入链接服务器表和sql server表

我使用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)

但是,由于链接服务器产品表包含大量记录,因此填充临时表需要一些时间.所以我认为不是拉动所有产品信息,如果我事先加入两个表,它可以提高性能.

可以这样做吗?有人可以帮忙吗?

sql-server openquery

5
推荐指数
1
解决办法
4万
查看次数

SQL Server OpenQuery()的行为与TOAD的直接查询不同

使用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() …

t-sql toad openquery oracle11g sql-server-2008-r2

5
推荐指数
1
解决办法
3171
查看次数

在 tsql 存储过程中使用 OPENQUERY 的原因是什么?

我目前正在审查一些在数据库上运行存储过程的作业。所有这些存储过程都连接到链接服务器。我对这个功能不太熟悉。我目前正在尝试确定为什么使用这些查询而不是普通查询,因为我正在运行的查询似乎正在提取数据。

我读到了这个,这是MSDN对openquery的解释。:

http://technet.microsoft.com/en-us/library/ms188427.aspx

我还读过这篇文章,这是一个 stackoverflow 链接,讨论为什么不在本地服务器上使用它。:

为什么在本地服务器上使用 OPENQUERY 不好?

我的问题是,当存储过程需要链接服务器的嵌入式凭据时,您基本上只使用它吗?或者还有更多我不知道的使用 OpenQuery 的原因吗?

t-sql sql-server openquery

5
推荐指数
1
解决办法
4980
查看次数

SQL Server 2012 - 使用openquery插入到链接的服务器表中

我有一个链接服务器,Remoteserver其中包含一个表,用于保存dir中的文件和文件夹名称

当我在远程服务器上时,我可以运行内置过程(xp_dirtree)并填充'files'表,但我需要做的是从执行此操作的本地SQL服务器运行查询:

  1. [Files]表中删除所有记录Remoteserver
  2. 插入来自存储过程的数据:

    INSERT [Remoteserver].[dbo].[files] (subdirectory,depth,isfile)
       EXEC master.sys.xp_dirtree '\\Fileserver\DBBackup',1,1;
    
    Run Code Online (Sandbox Code Playgroud)
  3. 选择"子目录"列

我尝试了一些使用openquery的东西,我可以选择现有的记录,但无法进行插入.

任何帮助表示赞赏.

sql-server openquery

5
推荐指数
1
解决办法
1万
查看次数

使用动态查询在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)

sql-server linked-server dynamic-sql openquery

5
推荐指数
1
解决办法
1万
查看次数

使用Openquery链接服务器更新表

我尝试过这段代码但仍然遇到以下错误,也许有人可以帮忙吗?

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语句工作正常,但是当我尝试更新时,我总是坚持这个.

sql t-sql sql-server openquery sql-server-2008

4
推荐指数
1
解决办法
2万
查看次数