我们创建了一个链接服务器来将 SQL Server 连接到我们的 ERP(运行 UniVerse 而不是 SQL Server)。它过去工作得很好,但现在对链接服务器的任何查询都会因 OLEDB 等待类型而陷入困境(数天)。
以前这种情况很少发生,重新启动 SQL Server 总能解决该问题。然而现在,重新启动服务器要么不能解决问题,要么最多一两个小时就能解决问题。
我们在 SQL Server 2016 和 2008 R2 中都遇到了该问题。
我们能够使用同一服务器上的其他工具以及与 SQL Server 相同的驱动程序来查询数据源。在一台服务器上,我们运行两个 SQL Server 2008 R2 实例。一种能够查询数据源,而另一种则陷入 OLEDB 等待类型。两者上的链接服务器的设置方式完全相同,并且它们使用相同的驱动程序。
我们尝试过:
我正在使用引用链接服务器的视图和存储过程:
SELECT Id, Name
FROM [LinkedServer].Database.dbo.FooView
Run Code Online (Sandbox Code Playgroud)
我想隐藏[LinkedServer].Database或至少隐藏[LinkedServer]我的视图和存储过程的一部分。这样我就可以拥有“与服务器无关”的代码,可以很容易地在生产服务器和开发服务器之间进行比较。
这可以在服务器级别(如链接服务器)或数据库级别(使用它的视图和存储过程)完成。
如何使用存储过程从另一台服务器运行作业?
让我们说
这是我如何使这项工作失去的部分?
xp_cmdshell + osql command -U: -P: + sp_startjob
Run Code Online (Sandbox Code Playgroud) 我支持使用 CodeSmith 和 NetTiers 模板生成 C# 代码的应用程序。CodeSmith 检查数据库并使用SET FMTONLY ON设置来确定应为其生成代码的列。
不幸的是,在从 SQL Server 2005 迁移到 2012 的过程中,在某些特定情况下,这不再起作用。有一个在链接服务器上执行存储过程的存储过程,并且为该存储过程生成的代码不正确。
我已经设法将问题EXEC与SET 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 询问数据库的方式。
我有以下存储过程需要将近一个小时才能完成。结果集大约有 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
我正在使用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'。”