2017-10-10 105 views
1

执行我有一个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

您将'@ ExecUID'声明为唯一标识符,然后尝试将其转换为唯一标识符。我想你想声明'@ ExecUID'作为varchar? – waka

+0

'viw_mdlImmAnnEle_Formulae'是一种视图,它本身会尝试进行转换吗?你正在转换一个参数(它已经是正确的类型),所以应该没有任何影响(但是优化器可以自由地评估视图中的行,或者不是,因为它选择了,所以传递一个文字不是和传递参数一样)。 –

+0

waka,你是对的 - 这就是它不工作的原因。一旦我将@ExecUID更改为varchar,就没有问题。当你看到解决方案时总是如此明显! Tks乔。 – mediaeval

回答

1

TOP没有ORDER BY是不确定的;根据选择的计划,SQL Server可能会返回任意的行。添加ORDER BY以获得一致的结果。

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