标签: linked-server

永无休止的 OLEDB 等待链接服务器

我们创建了一个链接服务器来将 SQL Server 连接到我们的 ERP(运行 UniVerse 而不是 SQL Server)。它过去工作得很好,但现在对链接服务器的任何查询都会因 OLEDB 等待类型而陷入困境(数天)。

以前这种情况很少发生,重新启动 SQL Server 总能解决该问题。然而现在,重新启动服务器要么不能解决问题,要么最多一两个小时就能解决问题。

我们在 SQL Server 2016 和 2008 R2 中都遇到了该问题。

我们能够使用同一服务器上的其他工具以及与 SQL Server 相同的驱动程序来查询数据源。在一台服务器上,我们运行两个 SQL Server 2008 R2 实例。一种能够查询数据源,而另一种则陷入 OLEDB 等待类型。两者上的链接服务器的设置方式完全相同,并且它们使用相同的驱动程序。

我们尝试过:

  • 重新启动 SQL Server
  • 重新启动数据源所在的服务器
  • 不同的司机
  • 重新创建链接服务器
  • 使用相同驱动程序使用不同工具查询数据源(成功)
  • 我们能够从受影响的 SQL Server 服务器 ping 数据源服务器
  • 我们能够使用 Telnet 从受影响的服务器连接到数据源

sql-server linked-server oledb

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

是否可以隐式而不是显式地引用链接服务器?

我正在使用引用链接服务器的视图和存储过程:

SELECT Id, Name
FROM [LinkedServer].Database.dbo.FooView
Run Code Online (Sandbox Code Playgroud)

我想隐藏[LinkedServer].Database或至少隐藏[LinkedServer]我的视图和存储过程的一部分。这样我就可以拥有“与服务器无关”的代码,可以很容易地在生产服务器和开发服务器之间进行比较。

这可以在服务器级别(如链接服务器)或数据库级别(使用它的视图和存储过程)完成。

sql-server linked-server

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

从另一台服务器中的存储过程运行作业?

如何使用存储过程从另一台服务器运行作业?

让我们说

  • 服务器 1:db1
  • 服务器 2:db2
  • 用户名:testsis
  • 密码:testsispass
  • 在 db2 中找到 sqljob:job1

这是我如何使这项工作失去的部分?

xp_cmdshell + osql command -U: -P: + sp_startjob
Run Code Online (Sandbox Code Playgroud)

sql-server stored-procedures linked-server jobs

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

SQL Server 2012 中的 FMTONLY 问题

我支持使用 CodeSmith 和 NetTiers 模板生成 C# 代码的应用程序。CodeSmith 检查数据库并使用SET FMTONLY ON设置来确定应为其生成代码的列。

不幸的是,在从 SQL Server 2005 迁移到 2012 的过程中,在某些特定情况下,这不再起作用。有一个在链接服务器上执行存储过程的存储过程,并且为该存储过程生成的代码不正确。

我已经设法将问题EXECSET FMTONLY ON. 以下(仅示例)SELECT适用于 2005 和 2012 实例:

SET FMTONLY ON
SELECT TOP(10) [MCMCU]
              ,[MCSTYL]
              ,[MCDC]
FROM [JDE].[JDE_CRP].[CRPDTA].[F0006]
SET FMTONLY OFF
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,这仅返回列标题。以下仅适用于 2005 实例:

SET FMTONLY ON
EXEC('SELECT TOP(10) [MCMCU]
                    ,[MCSTYL]
                    ,[MCDC]
      FROM [JDE_CRP].[CRPDTA].[F0006]') AT [JDE]
SET FMTONLY OFF
Run Code Online (Sandbox Code Playgroud)

在 2012 实例上运行时,SSMS 显示消息“命令成功完成”,但不显示列标题。

有什么我在这里想念的吗?也许是我需要更改的设置?链接服务器定义是相同的,包括用于连接的身份。是的,我知道这FMTONLY已被弃用,但我无法更改 CodeSmith 询问数据库的方式。

sql-server linked-server sql-server-2012

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

删除和插入性能 SQL Server

我有以下存储过程需要将近一个小时才能完成。结果集大约有 20 万台机器。

我所做的只是从链接服务器中提取一组 id,在本地服务器中删除这些 id,然后从远程服务器中提取这些 id 的所有详细信息并插入它们。INSERT 占 90%,DELETE 表占 9%,SELECT INTO 占 1%。

id 是主键/聚集索引。

    DECLARE @ProcessDate DATETIME
    SET @ProcessDate = CONVERT(VARCHAR(10), DATEADD(DAY, -3,
                                                    GETDATE()), 111)

    SELECT  DISTINCT id
    INTO    #temp_machines
    FROM    remote_server.db.dbo.table1
    WHERE   dt_modify >= @ProcessDate

    DELETE  FROM local_server.db.dbo.table2
    WHERE   id IN ( SELECT id  FROM  #temp_machines )

    INSERT  INTO local_server.db.dbo.table2
    SELECT  *
    FROM    remote_server.db.dbo.table1
    WHERE   id IN ( SELECT id  FROM  #temp_machines )
Run Code Online (Sandbox Code Playgroud)

有什么关于提高性能的建议吗?

performance sql-server-2008 sql-server linked-server query-performance

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

如何修改我现有的 T-SQL 查询以适用于链接服务器?

我正在使用SQL Server 2014并且我需要修改我现有的T-SQL查询,以便它适用于链接服务器。

我现有的代码如下:

USE [MyDatabase]

SELECT name 
FROM sysobjects
WHERE id IN ( SELECT id 
              FROM syscolumns 
              WHERE name like '%SPA%' )
Run Code Online (Sandbox Code Playgroud)

我通常使用以下方法连接到链接服务器:

Use [MyDatabase]

Select * from [xxx.xx.0.20].[LinkedDatabaseName].dbo.[TableName]
Run Code Online (Sandbox Code Playgroud)

我已经尝试了这里给出的答案(但它仍然不起作用):无法通过链接服务器查询 SQL 服务器元数据

这是我的尝试(尽管与上面显示的现有代码相比,我不太明白为什么我需要将该点 (.) 放在 sysobjects 中):

   USE [MyDatabase]
    
    SELECT name 
    FROM [xxx.xx.0.20].[LinkedDatabaseName].sys.objects
    WHERE id IN ( SELECT id 
                  FROM syscolumns 
                  WHERE name like '%SPA%' )
Run Code Online (Sandbox Code Playgroud)

我收到以下错误消息:“无效的列名 'id'。”

sql-server t-sql linked-server

0
推荐指数
1
解决办法
44
查看次数