带有/不带有linkserver的SQL Server存储过程给自己提供不同的结果

时间:2016-04-15 10:14:27

标签: sql-server-2008

我的UAT服务器上有一个存储过程,我使用指向生产服务器的链接服务器来检索数据(所以我不需要传输数据)。

当我将其部署到生产环境时,此链接服务器也被移动到生产服务器。在制作过程中,我们设置了一个指向它的精确链接服务器。

查询非常简单,

SELECT 
    Code 
    ,MIN(NAME)  as NAME 
    ,SUM(Qty) AS QTY
    ,E.TYPE1 
FROM
    [IPtoSelf,1433].[DATABASE].[dbo].TABLEA T
    --[DATABASE].[dbo].TABLEA T
INNER JOIN 
    [IPtoSelf,1433].[DATABASE].[dbo].TABLEB E ON T.CODE =  E.CODE
    -- [DATABASE].[dbo].TABLEB E
WHERE 
    YEAR(T.DATE) = 2016
    AND MONTH(T.DATE) = 2
    AND T.SOMEVALUE > 0
GROUP BY 
    T.CODE, E.TYPE1
ORDER BY   
    QTY DESC;

我通过运行存储过程获得结果:

EXEC [dbo].[SP_THE_STORED_PROC]

无论有没有[IPtoSelf,1433],存储过程的结果都是不同的!

我试过了:

  1. 在存储过程之外(即使用Management Studio)运行此查询,并且对链接服务器和不具有链接服务器的查询的结果是相同的。每一次!

  2. 与#1相比,存储过程中查询的结果与链接服务器错误。

  3. 无论我运行多少次,来自链接服务器的存储过程的错误值都保持一致。

  4. 4.如果我只是使用linkserver选择存储过程中的TABLEA或TABLEB,结果是正确的(即没有链接服务器或存储过程的一侧)。

    我的问题可以通过简单地在我的生产服务器上使用链接服务器来解决。但是,我真的想知道到底出了什么问题。由于循环,我从缓存的网络数据包到inter-wind查询结果有各种各样的猜测,但是我无法证明/调试它。

    这是我第一次看到这个,如果有人遇到过类似的问题,或者想知道从哪里开始调试,我真的很感激。

    提前致谢

    更新:2016年4月26日

    我还没有找到一种方法来追踪。但是,我确实最小化了我的问题范围。这件事不仅发生在存储过程中,也可以通过简单地执行查询来观察。

    例如,如果我跑:

    SELECT 
        T.Code,
        E.Code      
    FROM
        [IPtoSelf,1433].[DATABASE].[dbo].TABLEA T
    INNER JOIN 
        [IPtoSelf,1433].[DATABASE].[dbo].TABLEB E ON T.CODE =  E.CODE
    WHERE 
        YEAR(T.DATE) = 2016
        AND MONTH(T.DATE) = 2
    

    结果表将有一些T.Code<>行。 E.Code。

    我认为,这不仅仅是过滤顺序。

0 个答案:

没有答案