Sql server SQL Server如何处理对链接服务器的失败查询?
我有一个存储过程,它依赖于对链接服务器的查询 此存储过程的结构大致如下所示:Sql server SQL Server如何处理对链接服务器的失败查询?,sql-server,temp-tables,linked-server,Sql Server,Temp Tables,Linked Server,我有一个存储过程,它依赖于对链接服务器的查询 此存储过程的结构大致如下所示: -- Create local table var to stop query from needing round trips to linked server DECLARE @duplicates TABLE (eid NVARCHAR(6)) INSERT INTO @duplicates(eid) SELECT eid FROM [linked_server].[linked_database].[dbo]
-- Create local table var to stop query from needing round trips to linked server
DECLARE @duplicates TABLE (eid NVARCHAR(6))
INSERT INTO @duplicates(eid)
SELECT eid FROM [linked_server].[linked_database].[dbo].[linked_table]
WHERE es = 'String'
-- Update on my server using data from linked server
UPDATE [my_server].[my_database].[dbo].[my_table]
-- Many things, including
[status] = CASE
WHEN
eid IN (
SELECT eid FROM @duplicates
)
THEN 'String'
ELSE es
END
FROM [my_server].[another_database].[dbo].[view]
-- This view obscures sensitive information and shows only the data that I have permission to see
-- Many other things
查询本身要复杂得多,但关键思想是从链接服务器构建这个临时表,因为如果不运行,查询需要5分钟,如果运行则需要3秒
我最近遇到了一个问题,我的表更新失败,无法对照链接服务器检查重复信息
事件的逻辑链如下所示:
从原始视图获取所有数据
原始视图可能包含3000条记录,其中30条是
相关实体的副本,但其中1个字段具有
不同的价值观。
然后,我必须从另一台服务器获取数据,以了解其中的哪一台
副本是正确的。
当存储过程运行时,它会更新每个记录。
错误步骤-当存储过程命中重复记录时,它
再次更新my_表-因此es会连续更改多次。
当我们意识到my_表中引入了不正确的es值时,临时表是在这一事实之后添加的。
“my_database”不包含确定哪个元组是正确元组所需的数据,因此需要链接服务器。
据我所知,我们遇到了一个临时网络中断或连接超时,使我的\u服务器无法从链接的\u服务器获取响应,它只是将一个空表传递给了过程的其余部分
所以,我的问题是——我怎样才能防止这种情况发生
我不能只是检查表是否为空,因为它可以合法地为空。我需要确切地知道,从链接服务器进行的初始选择是否失败,是否超时,或者是否故意不返回任何内容。如果不知道要查询的表的定义,您可能会遇到数据太长的问题,并且表上会出现截断错误 最好确定和子串它
DECLARE @duplicates TABLE (eid NVARCHAR(6))
INSERT INTO @duplicates(eid)
SELECT SUBSTRING(eid,1,6) FROM [linked_server].[linked_database].[dbo].[linked_table]
WHERE es = 'String'
-- Update on my server using data from linked server
UPDATE [my_server].[my_database].[dbo].[my_table]
-- Many things, including
[status] = CASE
WHEN
eid IN (
SELECT eid FROM @duplicates
)
THEN 'String'
ELSE es
END
FROM [my_server].[another_database].[dbo].[view]
我遇到了一个类似的问题,我需要在服务器之间移动数据,无法使用网络连接,所以我最终执行了BCP out和BCP in。这是快速、干净的,并且消除了用户身份验证、驱动程序和信任域的复杂性。而且它是可重复的,可以用于增量加载。在不知道要查询的表的定义的情况下,您可能会遇到数据太长的问题,并且您的表会出现截断错误 最好确定和子串它
DECLARE @duplicates TABLE (eid NVARCHAR(6))
INSERT INTO @duplicates(eid)
SELECT SUBSTRING(eid,1,6) FROM [linked_server].[linked_database].[dbo].[linked_table]
WHERE es = 'String'
-- Update on my server using data from linked server
UPDATE [my_server].[my_database].[dbo].[my_table]
-- Many things, including
[status] = CASE
WHEN
eid IN (
SELECT eid FROM @duplicates
)
THEN 'String'
ELSE es
END
FROM [my_server].[another_database].[dbo].[view]
我遇到了一个类似的问题,我需要在服务器之间移动数据,无法使用网络连接,所以我最终执行了BCP out和BCP in。这是快速、干净的,并且消除了用户身份验证、驱动程序和信任域的复杂性。此外,它是可重复的,可用于增量加载。您能否详细说明我最近遇到的一个问题,即我的表更新未能通过链接服务器检查重复信息。如果该表为空,则错误更新是如何发生的?你说它可以合法地为空,那么这对更新和超时有什么影响呢?旁注,我会使用一个临时表而不是表变量。我支持@scsimon的建议。链接服务器是否设置了连接超时=0和查询超时=0?如果不是这样,您可能需要设置。我希望超时会引发错误,导致整个事务失败。。。16级。。。那么你确定发生了这种情况吗?@scsimon我在原始问题中添加了更多的上下文来帮助解决这个问题。你能详细说明一下我最近遇到的一个问题吗?我的表更新没有通过链接服务器检查重复信息。如果表是空的,那么坏的更新是如何发生的?你说它可以合法地为空,那么这对更新和超时有什么影响呢?旁注,我会使用一个临时表而不是表变量。我支持@scsimon的建议。链接服务器是否设置了连接超时=0和查询超时=0?如果不是这样,您可能需要设置。我希望超时会引发错误,导致整个事务失败。。。16级。。。那么你确定这是真的吗?@scsimon我给原始问题添加了更多的上下文来帮助解决它。注意到了,但我不认为这是问题的根源。最终更改的记录将返回一个包含大约30行6个字符的列表。注意,但我不认为这是问题的根源。最终更改的记录将返回一个包含约30行6个字符的列表。