在存储过程中执行代码时获得不同的结果

时间:2017-10-10 12:53:06

标签: sql sql-server

我有一个select语句如下:

SELECT TOP 1 TRY_CONVERT(UNIQUEIDENTIFIER,'6B75045F-22BF-4BD0-8170-32FA7DBF2A2xC')
FROM [sch_ImmAnn].[viw_mdlImmAnnEle_Formulae]

UID故意不正确,当我执行此语句时,返回值NULL,正如我所期望的那样。但是,如果我在存储过程中对此语句进行编码,则如下所示:

CREATE PROCEDURE [sch_Common].[usp_TestValid_UID]
    @ExecUID UNIQUEIDENTIFIER
AS

BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    SELECT TOP 1 TRY_CONVERT(UNIQUEIDENTIFIER,@ExecUID)
    FROM [sch_ImmAnn].[viw_mdlImmAnnEle_Formulae]

END

当我使用作为参数传递的相同UID执行它时,它会返回错误:

  

将数据类型varchar转换为uniqueidentifier时出错。

我该如何解决这个问题?为什么会这样?

1 个答案:

答案 0 :(得分:1)

没有TOP

ORDER BY不具有确定性; SQL Server可能会返回任意行,具体取决于所选的计划。添加ORDER BY以获得一致的结果。

也就是说,由于2个查询的SET选项不同,执行计划可能会有所不同。请注意,ANSI_NULLSQUOTED_IDENTIFIER是存储过程的“粘性”设置。创建proc时生效的设置也会在执行时使用,而不是调用proc的会话设置。