标签: linked-server

无法为链接服务器的 OLE DB 提供程序“SQLNCLI11”启动嵌套事务

我有两个链接的服务器,并且想要创建一个存储过程,该过程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。

sql-server linked-server sql-server-2014

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

SQL Server - 链接服务器 - 将 OPENROWSET 与 Windows 集成安全性结合使用

我看过很多关于使用集成安全性(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

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

将链接服务器从 SQL Server 11.0.5058 添加到 SQL Server 10.50.4000

我尝试从 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)

sql-server sql-server-2008-r2 linked-server sql-server-2012

3
推荐指数
1
解决办法
2155
查看次数

通过链接服务器查询 sys.master_files

通过链接服务器查询 sys.master_files,我没有得到任何结果。

为什么?我如何解决这个问题?

sql-server metadata linked-server

3
推荐指数
1
解决办法
1888
查看次数

通过链接服务器从 SQL Server 2008 R2 到 SQL Server 2014 执行存储过程

我们正处于从 SQL Server 2008 R2 升级到 SQL Server 2014 的规划阶段。

我们的系统针对不同服务器上的不同数据库执行存储过程。

如果我们将一台服务器升级到 SQL Server 2014,但将其余服务器留在 SQL Server 2008 R2 上,我们会失去这种能力吗?

sql-server sql-server-2008-r2 linked-server sql-server-2014

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

从链接服务器读取的数据在生产服务器上返回不同的数据类型

我有一个 SQL Server 从 SP 内的链接 Oracle 服务器获取数据。

在我的开发服务器上,EF6 坚持 SP 正在返回double其中一列的数据类型,但在 prod 中,它坚持同一列是decimal.

SQL Server 版本略有不同:

  • 产品:11.0.5582.0
  • 开发:11.0.5613.0

链接服务器的配置方式没有(明显的)差异(即我比较了 SSMS 中的连接属性)。

作为一个新功能,生产数据库在数据库中只有很少(零,偶数)行,而开发服务器有很多。我有一种感觉可能是相关的,因为我记得必须在开发过程中更改数据类型(尽管当时我并没有考虑太多)。

这里可能有什么问题?

oracle entity-framework linked-server sql-server-2012

3
推荐指数
1
解决办法
491
查看次数

SQL Server - 链接服务器错误 - 无法连接到服务器 XYZ,因为

正在使用的服务器: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 很糟糕。很快就会得到处理。

linked-server sql-server-2012 transactional-replication

3
推荐指数
1
解决办法
8134
查看次数

为什么SQL Server OPENQUERY to Oracle 在SQL Server 2016 到2008 上返回不同的列类型

我在同一台机器上有两个 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)

oracle sql-server odbc linked-server

3
推荐指数
1
解决办法
690
查看次数

链接服务器:如何在远程表上设置排他锁?

正如我发现的那样,您可以在事务中对所需的表设置锁定:

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)

但是当我在链接服务器表上运行此代码时,该表仍然可以从链接服务器内访问!为什么?我如何像我的例子一样在这个远程表上设置锁?

sql-server t-sql linked-server

3
推荐指数
1
解决办法
617
查看次数

如何从链接服务器上的表中删除行

我需要从具有相同架构的多个服务器上的多个数据库中的表中删除行。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)

sql-server t-sql linked-server

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