SQL Server: mengkonversi UniqueIdentifier ke string dalam pernyataan kasus

136

Kami memiliki tabel log yang memiliki kolom pesan yang terkadang memiliki jejak tumpukan pengecualian. Saya memiliki beberapa kriteria yang menentukan apakah pesannya memiliki ini. Kami tidak ingin menampilkan pesan-pesan ini kepada pelanggan tetapi sebaliknya memiliki pesan seperti:

Terjadi Kesalahan Internal. Hubungi KAMI dengan kode referensi xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

di mana xxx dll adalah kolom pedoman di tabel. Saya menulis proc tersimpan seperti ini:

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

RequestIDadalah datatype panduan dalam SQL Server dan tidak dikonversi ke string di sini. Saya telah melihat beberapa kode tentang cara mengkonversi Guid ke string, tetapi multi-baris dan saya pikir itu tidak akan berfungsi dalam pernyataan kasus. Ada ide?

aarona
sumber

Jawaban:

257

Saya pikir saya menemukan jawabannya:

convert(nvarchar(50), RequestID)

Inilah tautan tempat saya menemukan informasi ini:

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

aarona
sumber
21
Atau, pilih (RequestID as varchar (50))
MK_Dev
3
Apa perbedaan mendasar antara cast () dan convert ()?
RK Sharma
5
@RKSharma itu adalah pertanyaan sempurna untuk Anda tanyakan di stackoverflow.com atau cari situs ini untuk melihat apakah seseorang telah menjawabnya.
aarona
1
Saya tidak tahu mengapa saya memilih nvarchar, apalagi nvarchar(50). Pengidentifikasi unik, ketika dikonversi ke nilai teks diperlakukan dalam hex-dash-36.
user2864740
9
Seperti jawaban lain mengatakan, Anda bisa menyingkat ini cast(RequestID as char(36)).
Frank Tan
90

Dimungkinkan untuk menggunakan fungsi konversi di sini, tetapi 36 karakter sudah cukup untuk menampung nilai pengidentifikasi unik:

convert(nvarchar(36), requestID) as requestID
Philippe Grondier
sumber
2
karena panjangnya tetap bahkan varchar (36) sudah cukup di sini
gdbdable
11
Anda mengatakan "tetap" namun "varchar" dalam kalimat yang sama ... bagaimana char(36)? Anda mungkin juga menggunakan nchar(36), tetapi karena GUID tidak mengandung unicode, itu tidak memberi Anda apa pun. Sebaliknya, operasi dengan charumumnya lebih cepat daripada varchar.
r2evans
47

Menurut pendapat saya, uniqueidentifier/ GUID bukanlah a varcharatau a nvarchartetapi a char(36). Karena itu saya menggunakan:

CAST(xyz AS char(36))
Silvan Hofer
sumber
8

Alih-alih Str(RequestID), cobaconvert(varchar(38), RequestID)

AussieAtHeart
sumber