T-SQL在存储的代码和查询窗格中的相同代码之间产生不同的结果

时间:2016-08-05 12:23:38

标签: sql-server tsql stored-procedures ssms

我正在处理一个应返回o或1的过程,具体取决于参数计算的结果(用于询问数据库中2个表的参数)。

当我在查询窗格中执行该代码时,它会为我提供我期望的结果。 代码如下:

SELECT TOP 1 state, updDate INTO #history
FROM [xxx].[dbo].[ImportHystory]    WHERE (db = 'EB') ORDER BY addDate DESC;

IF (SELECT state FROM #history) = 'O' 
BEGIN       
        SELECT TOP 1 * INTO #process_status
        FROM yyy.dbo.process_status WHERE KeyName = 'eb-importer';

        IF(SELECT s.EndDate FROM #process_status s) IS NOT NULL
            IF (SELECT s.EndDate FROM #process_status s) > (SELECT h.updDate FROM #history h)
                BEGIN
                    IF (SELECT MessageLog from #process_status) IS NOT NULL SELECT 1;
                    ELSE SELECT 0;
                END
            ELSE 
                SELECT  1;
        ELSE
            SELECT 1;
    END
ELSE
    SELECT 0

我遇到来自#process_status的EndDate为空的情况,因此执行返回1。 一旦我将SAME代码放入SP中,并将'EB'和'eb-importer'作为参数传递,它将返回0.

我用我面前的表格中的数据执行程序,所以我确定结果是错误的。

程序内:

    ALTER PROCEDURE [dbo].[can_start_import] (@keyName varchar, @db varchar, @result bit output)
    DECLARE @result bit;

并替换每个

    SELECT {0|1}

    SELECT @result = {0|1}

从“查询”窗格执行:

    DECLARE @result bit;
    EXEC [dbo].[can_start_import] @KeyName = 'eb-importer', @db = 'EB', @result = @result OUTPUT
    SELECT @result AS N'@result'

为什么会这样?

2 个答案:

答案 0 :(得分:6)

您正在进行top(1)查询而没有order by。这意味着SQL Server可以从table1中选择与where子句匹配的任何行。

如果您想保证每次执行该代码时结果都相同,您需要一个明确命令行的order by语句。

答案 1 :(得分:0)

所以,显然有两件事需要做:

  • 设置varchar参数的长度,使用更长的
  • 使用'like'过滤而不是'=',因为上帝知道是什么原因

现在它正如我预期的那样工作,但如果我使用相等的话,我仍然不会在查询窗格和过程之间得到不同的结果...