SQL Server:CaseステートメントでUniqueIdentifierを文字列に変換する


136

例外スタックトレースが含まれる場合があるメッセージ列を含むログテーブルがあります。メッセージにこれがあるかどうかを判断するいくつかの基準があります。これらのメッセージをお客様に表示するのではなく、次のようなメッセージを表示します。

内部エラーが発生しました。参照コードxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxを添えてお問い合わせください

ここで、xxxなどは表のGUID列です。私はこのようにストアドプロシージャを書いています:

declare @exceptionCriteria nvarchar(50)
select @exceptionCriteria = '%<enter criteria etc>%'

select LogDate,
       case
       when Message like @exceptionCriteria
       then 'Internal Error Occured. Reference Code: ' + str(RequestID)
       else Message
       end
  from UpdateQueue

RequestIDSQL ServerのGuidデータ型であり、ここでは文字列に変換されません。Guidを文字列に変換する方法に関するコードをいくつか見ましたが、それは複数行であり、caseステートメントでは機能しないと思います。何か案は?

回答:


257

私は答えを見つけたと思います:

convert(nvarchar(50), RequestID)

これが私がこの情報を見つけたリンクです:

http://msdn.microsoft.com/en-us/library/ms187928.aspx


21
または、cast(RequestID as varchar(50))
MK_Dev

3
cast()とconvert()の基本的な違いは何ですか?
RK Sharma

5
@RKSharmaは、stackoverflow.comで質問するか、このサイトを検索して、誰かがすでに回答しているかどうかを確認するのに最適な質問です。
aarona

1
なぜ私が選ぶのか分からないnvarchar、はるかに少ないnvarchar(50)。一意の識別子は、テキスト値に変換されると、16進ダッシュ36で処理されます。
user2864740

9
他の答えが言うように、あなたはこれを凝縮することができますcast(RequestID as char(36))
フランクタン

90

ここでは変換関数を使用できますが、一意の識別子の値を保持するには36文字で十分です。

convert(nvarchar(36), requestID) as requestID

2
長さが固定されているため、ここではvarchar(36)で十分です
gdbdable

11
あなたは同じ文で「固定」でありながら「varchar」と言います...どうchar(36)ですか?も使用できnchar(36)ますが、GUIDにはUnicodeが含まれていないため、何も購入されません。逆に、を使用した操作はchar、一般によりも高速ですvarchar
r2evans 2017年

47

私の意見では、uniqueidentifier/ GUIDはどちらもあるvarcharでもnvarcharなく、char(36)。したがって、私は使用します:

CAST(xyz AS char(36))

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.