我正在处理一个应返回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'
为什么会这样?
答案 0 :(得分:6)
您正在进行top(1)
查询而没有order by
。这意味着SQL Server可以从table1
中选择与where子句匹配的任何行。
如果您想保证每次执行该代码时结果都相同,您需要一个明确命令行的order by
语句。
答案 1 :(得分:0)
所以,显然有两件事需要做:
现在它正如我预期的那样工作,但如果我使用相等的话,我仍然不会在查询窗格和过程之间得到不同的结果...