我有两个链接的服务器,并且想要创建一个存储过程,该过程SELECT仅从第一台服务器的一个表中获取INSERT数据,并从第二个服务器中获取另一个表中的数据。
程序代码如下所示:
BEGIN TRAN
INSERT INTO [RI].[TEST_DB].[TEST_TABLE] (...)
SELECT ...
FROM [TABLE]
TRUNCATE [TABLE]
COMMIT TRAN
Run Code Online (Sandbox Code Playgroud)
但我收到以下错误:
链接服务器“RI”的 OLE DB 访问接口“SQLNCLI11”返回消息“无法在此会话上启动更多事务。”。
消息 7395,级别 16,状态 2,过程 usp_test,第 46 行
无法为链接服务器“RI”的 OLE DB 提供程序“SQLNCLI11”启动嵌套事务。
需要嵌套事务,因为 XACT_ABORT 选项设置为 OFF。
我看过很多关于使用集成安全性(Windows 身份验证)的 OPENROWSET 的文章,但我无法让它为我工作。
使用 SQL Server 身份验证工作正常:
select *
FROM
OPENROWSET('SQLOLEDB',
'myserver';'monitor';'#J4g4nn4th4#',
'SELECT GETDATE() AS [RADHE]')
Run Code Online (Sandbox Code Playgroud)
但我尝试使用 Windows 身份验证运行相同的查询,但它不起作用:
select *
FROM
OPENROWSET('SQLOLEDB',
'myserver';'Integrated Security=SSPI',
'SELECT GETDATE() AS [RADHE]')
Run Code Online (Sandbox Code Playgroud)
有人可以发布一个有效的示例吗?
这是一篇描述 OPENROWSET 用法的好文章。
使用 OPENROWSET 的工作脚本示例 - 请阅读评论
----------------------------------------------------------------
-- this works - linked server REPLON1
----------------------------------------------------------------
select *
FROM
OPENROWSET('SQLOLEDB',
'Server=REPLON1;Trusted_Connection=yes;',
'SELECT GETDATE() AS [RADHE]')
select *
FROM
OPENROWSET('SQLOLEDB',
'Server=REPLON1;Trusted_Connection=yes;',
'SET FMTONLY OFF select * from sys.dm_exec_requests')
SELECT a.*
FROM OPENROWSET('SQLOLEDB', 'server=replon1;Trusted_Connection=yes;', 'SET
FMTONLY OFF select * …Run Code Online (Sandbox Code Playgroud) security sql-server linked-server sql-server-2012 openrowset
我尝试从 SQL Server 2012 (11.0.5058) 添加在 SQL Server 2008 R2 (10.50.4000) 上运行的链接服务器。
我不断收到此错误:
链接服务器已创建,但连接测试失败。您想保留链接服务器吗?

有谁知道如何解决这个问题?
不同版本数据库之间搭建链接服务器有没有限制?
好的,使用 tsql 代码创建了这个链接服务器
EXEC sp_addlinkedserver
@server='xxxLinkedServer', -- here you can specify the name of the linked server
@srvproduct='',
@provider='sqlncli', -- using SQL Server Native Client
@datasrc='xxxxxx', -- add here your server name
@location='',
@provstr='',
@catalog='smpro5' -- add here your database name as initial catalog (you cannot connect to the master database)
-- Add credentials and options to this linked server
EXEC sp_addlinkedsrvlogin
@rmtsrvname = …Run Code Online (Sandbox Code Playgroud) 通过链接服务器查询 sys.master_files,我没有得到任何结果。
为什么?我如何解决这个问题?
我们正处于从 SQL Server 2008 R2 升级到 SQL Server 2014 的规划阶段。
我们的系统针对不同服务器上的不同数据库执行存储过程。
如果我们将一台服务器升级到 SQL Server 2014,但将其余服务器留在 SQL Server 2008 R2 上,我们会失去这种能力吗?
我有一个 SQL Server 从 SP 内的链接 Oracle 服务器获取数据。
在我的开发服务器上,EF6 坚持 SP 正在返回double其中一列的数据类型,但在 prod 中,它坚持同一列是decimal.
SQL Server 版本略有不同:
链接服务器的配置方式没有(明显的)差异(即我比较了 SSMS 中的连接属性)。
作为一个新功能,生产数据库在数据库中只有很少(零,偶数)行,而开发服务器有很多。我有一种感觉可能是相关的,因为我记得必须在开发过程中更改数据类型(尽管当时我并没有考虑太多)。
这里可能有什么问题?
正在使用的服务器:SQL Server 2012 SP3
我刚刚收到一个奇怪的错误(很奇怪,因为它之前工作过)
could not connect to server LNK_SRV because sa is not defined as a remote login
Run Code Online (Sandbox Code Playgroud)
sys.servers 说 LNK_SRV 的 is_linked = 0 - 不知道为什么。返回结果如下
select top 10 * from LNK_SRV.DBName.dbo.TblName
Run Code Online (Sandbox Code Playgroud)
但手续却失败了
exec LNK_SRV.DBName.dbo.ProcName
Run Code Online (Sandbox Code Playgroud)
在我们删除链接服务器并重新添加它之前,它工作正常。
此外,LNK_SRV 也用于复制。
注意:我知道 sa 很糟糕。很快就会得到处理。
我在同一台机器上有两个 SQL Server 实例,一个是 2008 年,一个是 2016 年。两个实例都有一个链接服务器连接到同一个 Oracle 12 服务器。
如果我运行以下查询,2008 年将 1.23 作为 VARCHAR 返回,但 2016 年将其作为浮点数返回
SELECT * INTO #tst FROM OPENQUERY(JOHPROD,'SELECT 1.23 FROM dual')
SELECT t.Name,* FROM tempdb.sys.columns c
INNER JOIN sys.types t ON t.system_type_id = c.system_type_id
WHERE [object_id] = OBJECT_ID(N'tempdb..#tst');
Run Code Online (Sandbox Code Playgroud)
两个实例都指向同一个 Oracle 服务器,并且都使用同一个 Oracle ODBC 驱动程序。
两个链接服务器都具有相同的定义...
EXEC master.dbo.sp_addlinkedserver @server = N'ORAPROD', @srvproduct=N'Oracle', @provider=N'OraOLEDB.Oracle', @datasrc=N'ORAPROD'
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'ORAPROD',@useself=N'False',@locallogin=NULL,@rmtuser=N'ORAUSER',@rmtpassword='########'
GO
EXEC master.dbo.sp_serveroption @server=N'ORAPROD', @optname=N'collation compatible', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'ORAPROD', @optname=N'data access', @optvalue=N'true'
GO
EXEC master.dbo.sp_serveroption …Run Code Online (Sandbox Code Playgroud) 正如我发现的那样,您可以在事务中对所需的表设置锁定:
begin tran
select 1 from myTable
with (tablock /*or tablockx to block even reads from table*/, holdlock)
-- do your work
commit tran
Run Code Online (Sandbox Code Playgroud)
但是当我在链接服务器表上运行此代码时,该表仍然可以从链接服务器内访问!为什么?我如何像我的例子一样在这个远程表上设置锁?
我需要从具有相同架构的多个服务器上的多个数据库中的表中删除行。OPENROWSET()似乎不是答案。
如果我这样做:
SET @sqlStr = '
SELECT TOP 0 * FROM OPENROWSET(''SQLNCLI'', ''Server=' + @Server + ';Trusted_Connection=yes;'',
''DELETE FROM [' + @DBName + '].dbo.tblName WHERE foo='bar') AS a';
EXEC (@sqlStr);
Run Code Online (Sandbox Code Playgroud)
我收到错误
Msg 11525, Level 16, State 1, Procedure sp_describe_first_result_set, Line 1
The metadata could not be determined because statement 'DELETE FROM . . .
Run Code Online (Sandbox Code Playgroud)
如果我添加SELECT 1;到查询中以便像下面那样返回结果集,我会得到一行一列的结果(顺便说一句,它的值不是“1”)。但是,不会发生删除操作。
SET @sqlStr = '
SELECT TOP 0 * FROM OPENROWSET(''SQLNCLI'', ''Server=' + @Server + ';Trusted_Connection=yes;'',
''SELECT 1; DELETE FROM [' …Run Code Online (Sandbox Code Playgroud) linked-server ×10
sql-server ×8
oracle ×2
t-sql ×2
metadata ×1
odbc ×1
openrowset ×1
security ×1