在数据库上运行SQL语句或存储过程时,是否可以连接到外部数据库并从中提取数据?
就像是:
SELECT a.UserID, b.DataIWantToGet
FROM mydb.Users as a, externaldb.Data as b
Run Code Online (Sandbox Code Playgroud) 在使用Sybase 12.5驱动程序的SQL Server 2008中,一切正常,但现在我们已经使用64位驱动程序迁移到SQL Server 2012和Sybase 15,似乎事情已经破裂.
如果我测试链接服务器连接它给我链接服务器成功的消息但是当我在视觉上深入查看目录虽然它列出了所有这些目录,但它们显示为空白如此

但项目计数是正确的,因为我们在Sybase中有许多目录.我认识到的另一个有趣的事情是,当我执行和OPENQUERY时,它给了我正确的行数,但仍显示空字符串,如此

我不知道这里发生了什么,我唯一的线索是当我在这些空白数据库中深入查看时出现此错误消息.此异常提示.

Failed to retrieve data for this request. (Microsoft.SqlServer.Management.Sdk.Sfc)
------------------------------
ADDITIONAL INFORMATION:
An exception occurred while executing a Transact-SQL statement or batch. (Microsoft.SqlServer.ConnectionInfo)
------------------------------
Cannot obtain the schema rowset "DBSCHEMA_TABLES" for OLE DB provider "MSDASQL" for linked server "TEST". The provider supports the interface, but returns a failure code when it is used. (Microsoft SQL Server, Error: 7311)
Run Code Online (Sandbox Code Playgroud)
任何想法为什么会这样?有谁知道解决这个问题?
我正在对一个远程链接服务器进行一些相当复杂的查询,能够在临时表中存储一些信息然后对它进行连接是有用的 - 所有这些都与远程数据有关.在本地创建临时表并通过线路连接它们的速度非常慢.
是否可以强制在远程服务器上创建临时表?假设我没有足够的权限来创建我自己的真实(永久)表.
我有这个问题
UPDATE linkeddb...table SET field1 = 'Y' WHERE column1 = '1234'
这需要23秒来选择和更新一行
但是如果我使用openquery(我不想这样做)那么它只需要半秒钟.
我不想使用openquery的原因是我可以安全地为我的查询添加参数,并且可以安全地进行SQL注入.
有谁知道它运行这么慢的任何原因?
我在SQL Server中有一个链接服务器设置来命中Oracle数据库.我在SQL Server中有一个查询,它使用点表示法连接到Oracle表.我收到Oracle的"No Data Found"错误.在Oracle方面,我正在访问一个表(不是视图),并且不涉及存储过程.
首先,当没有数据时,我应该只获得零行而不是错误.
其次,在这种情况下应该有数据.
第三,我只看到PL/SQL代码中的ORA-01403错误; 永远不会在SQL中.
这是完整的错误消息:
链接服务器"OM_ORACLE"的OLE DB提供程序"OraOLEDB.Oracle"返回消息"ORA-01403:未找到数据".
消息7346,级别16,状态2,行1无法从OLE DB提供程序"OraOLEDB.Oracle"获取链接服务器"OM_ORACLE"的行数据.
这里有一些更多的细节,但它可能没有任何意义,因为你没有我的表和数据.
这是带问题的查询:
select *
from eopf.Batch b join eopf.BatchFile bf
on b.BatchID = bf.BatchID
left outer join [OM_ORACLE]..[OM].[DOCUMENT_UPLOAD] du
on bf.ReferenceID = du.documentUploadID;
Run Code Online (Sandbox Code Playgroud)
我无法理解为什么我发现"没有找到数据"错误.下面的查询使用相同的Oracle表并且不返回任何数据但我没有收到错误 - 我只是没有返回任何行.
select * from [OM_ORACLE]..[OM].[DOCUMENT_UPLOAD] where documentUploadID = -1
Run Code Online (Sandbox Code Playgroud)
下面的查询返回数据.我刚刚从连接中删除了一个SQL Server表.但是删除批处理表不会更改从batchFile返回的行(在两种情况下都是271行 - batchFile中的所有行都有批处理条目).它仍应将相同的batchFile行连接到相同的Oracle行.
select *
from eopf.BatchFile bf
left outer join [OM_ORACLE]..[OM].[DOCUMENT_UPLOAD] du
on bf.ReferenceID = du.documentUploadID;
Run Code Online (Sandbox Code Playgroud)
此查询返回5行.它应该与原始查询中的5相同.(我不能使用它,因为我需要批处理和batchFile表中的数据).
select *
from [OM_ORACLE]..[OM].[DOCUMENT_UPLOAD] du
where du.documentUploadId
in
(
select bf.ReferenceID
from eopf.Batch …Run Code Online (Sandbox Code Playgroud) 我正在尝试在本地复制生产环境,并且生产数据库使用链接服务器。我已经能够创建 localdb 的多个实例;是否可以在 localdb 实例之间创建链接服务器?如果没有,我还有哪些其他可用选项(理想情况下不必使用完整的 sql 实例)。
如果它是一个常规数据库,我可以简单地使用这个查询来获取数据库的所有表名及其列名的列表。
use [my_database_name]
GO
SELECT sys.tables.name AS Table_Name,
sys.columns.name AS Column_Name,
sys.columns.max_length,
(schema_id) As Schema_name
FROM sys.tables
INNER JOIN sys.columns
ON sys.tables.OBJECT_ID=sys.columns.object_id
ORDER BY schema_name, sys.tables.name, sys.columns.name
Run Code Online (Sandbox Code Playgroud)
但现在我需要连接到链接服务器数据库,因此无法使用“使用”。还有其他方法吗?
我有一个从SQL Server到mySQL数据库的链接服务器(使用MySQL ODBC Driver 5.3的Windows Server).我有一个独特的情况,如果我在OPEN QUERY中转换它们,我只能返回我的longtext列:
SELECT *
FROM
OPENQUERY (woocommerce, 'SELECT meta_id, CONVERT(meta_value using UTF8) as meta_value
FROM woocommerce.wp_postmeta WHERE meta_id = 9465078')
Run Code Online (Sandbox Code Playgroud)
如果我不转换/转换它我从链接服务器收到以下错误:
Msg 7399, Level 16, State 1, Line 1
The OLE DB provider "MSDASQL" for linked server "woocommerce" reported an error. The provider reported an unexpected catastrophic failure.
Run Code Online (Sandbox Code Playgroud)
我需要更新这个longtext列,"meta_value",但我不能,因为它已被转换/转换.
UPDATE
OPENQUERY (woocommerce, 'SELECT meta_id, CONVERT(meta_value using utf8)
FROM woocommerce.wp_postmeta WHERE meta_id = 9465078')
SET meta_value = 'outofstock';
Run Code Online (Sandbox Code Playgroud)
有没有办法使用OPENQUERY和链接服务器更新已转换/转换列?我尝试过转换或转换它的方式.
在网络共享上使用tnsnames.ora文件时,使SQL Server链接服务器连接到Oracle时出现问题。
如果我将tnsnames.ora文件复制到本地服务器,则链接的服务器可以正常工作。但是,我们将文件保留在网络共享上。我的sql服务帐户对共享具有读取权限。我将TNS_ADMIN系统变量配置为网络共享,链接的服务器不再起作用。我得到ora-12154:无法解析指定的连接标识符。tnsping和sqlplus在服务器上工作。当我使用过程监视器进行进一步调查时,我看到:
Operation: createFile
Result: ACCESS DENIED
...
Impersonating: domain\MyLogin
Run Code Online (Sandbox Code Playgroud)
这似乎是一个问题,但也许是假阳性?如果某个进程试图模拟我的帐户并访问远程资源,则该进程将失败,因为我们没有将Kerberos配置为处理双跳。
在配置了网络共享的情况下,SQLPlus和TNSPing可以正常工作。
我看了这篇文章,尝试了看似相关但没有成功的项目。
附加信息:
sqlnet.ora具有:SQLNET.AUTHENTICATION_SERVICES =(NTS)NAMES.DIRECTORY_PATH =(TNSNAMES,EZCONNECT)
我可以将文件浏览器作为服务帐户打开,然后打开tnsnames文件。
在SQL Server 2008(版本10.0.4000)中,我已经创建了一个到Active Directory服务器的链接服务器.
这个查询:
select TOP 901 *
from openquery(adsisca, '
select givenName,
sn,
sAMAccountName
from ''LDAP://10.1.2.3:389''
where objectCategory = ''Person''
and
objectClass = ''InetOrgPerson''
')
Run Code Online (Sandbox Code Playgroud)
作品.
但是,更改查询并尝试检索902行不会:
select TOP 902 *
from openquery(adsisca, '
select givenName,
sn,
sAMAccountName
from ''LDAP://10.1.2.3:389''
where objectCategory = ''Person''
and
objectClass = ''InetOrgPerson''
')
Run Code Online (Sandbox Code Playgroud)
错误是:
消息7330,级别16,状态2,行1无法从OLE DB提供程序"ADSDSOObject"获取链接服务器"adsisca"的行.
我发现其他人在论坛上讨论相同的问题,他们从来没有修复它,只是围着它编写多个视图并将它们联合在一起.
是否有一个更优雅的修复,是否有一个设置,我可以在某处更改以检索超过901行?
linked-server ×10
sql-server ×7
sql ×4
openquery ×2
asp.net ×1
database ×1
localdb ×1
mysql ×1
ora-01403 ×1
oracle ×1
sybase-ase ×1
t-sql ×1
temp-tables ×1
tnsnames ×1