2017-10-10 5 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 to uniqueidentifier。

どのように私はこの問題を回避することができますか?なぜそれが起こっているのですか?

+1

'@ ExecUID'を一意の識別子として宣言し、一意の識別子に変換しようとします。あなたは '@ExecUID'をvarcharとして宣言したいと思いますか? – waka

+0

'viw_mdlImmAnnEle_Formulae'は、自分自身で変換を試みるビューです。どのような効果も持たないように(すでに正しいタイプの)パラメータを変換しています(ただし、オプティマイザはビューの行を自由に評価するかどうかは自由です)。パラメーターを渡すのと同じです)。 –

+0

ワカ、あなたは正しい - それが働いていない理由です。 @ExecUIDをvarcharに変更すると、それは問題ありませんでした。あなたが解決策を見たときにいつもとても明白です! Tks Joe。 – mediaeval

答えて

1

TOPORDER BYは確定的ではありません。 SQL Serverは、選択した計画に応じて任意の行を返すことがあります。一貫した結果を得るためにORDER BYを追加してください。

つまり、2つのクエリのSETオプションが異なるため、実行計画が異なる可能性があります。 ANSI_NULLSQUOTED_IDENTIFIERは、ストアドプロシージャの "固定"設定であることに注意してください。 procを作成したときの設定は、procを呼び出すセッション設定ではなく、実行時にも使用されます。

関連する問題