Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server如何处理对链接服务器的失败查询?_Sql Server_Temp Tables_Linked Server - Fatal编程技术网

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个字符的列表。