我有一个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时出错。
我该如何解决这个问题?为什么会这样?
答案 0 :(得分:1)
TOP
的 ORDER BY
不具有确定性; SQL Server可能会返回任意行,具体取决于所选的计划。添加ORDER BY
以获得一致的结果。
也就是说,由于2个查询的SET选项不同,执行计划可能会有所不同。请注意,ANSI_NULLS
和QUOTED_IDENTIFIER
是存储过程的“粘性”设置。创建proc时生效的设置也会在执行时使用,而不是调用proc的会话设置。