SQL Server: การแปลง UniqueIdentifier เป็นสตริงในคำสั่ง case


145

เรามีตารางบันทึกที่มีคอลัมน์ข้อความที่บางครั้งมีการติดตามกองซ้อนข้อยกเว้น ฉันมีเกณฑ์บางอย่างที่กำหนดว่าข้อความมีสิ่งนี้หรือไม่ เราไม่ต้องการแสดงข้อความเหล่านี้ให้กับลูกค้า แต่มีข้อความเช่น:

เกิดข้อผิดพลาดภายใน ติดต่อเราด้วยรหัสอ้างอิง xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

โดยที่ xxx etc เป็นคอลัมน์ guid ในตาราง ฉันกำลังเขียน proc ที่จัดเก็บไว้ดังนี้:

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

RequestIDเป็น Guid datatype ใน SQL Server และไม่ได้แปลงเป็นสตริงที่นี่ ฉันเคยเห็นรหัสบางอย่างเกี่ยวกับวิธีการแปลง Guid เป็นสตริง แต่เป็นแบบหลายเส้นและฉันไม่คิดว่ามันจะใช้งานได้ในกรณีคำสั่ง ความคิดใด ๆ ?

คำตอบ:


271

ฉันคิดว่าฉันพบคำตอบ:

convert(nvarchar(50), RequestID)

นี่คือลิงค์ที่ฉันพบข้อมูลนี้:

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


21
หรืออีกวิธีหนึ่งคือแคสต์ (RequestID เป็น varchar (50))
MK_Dev

3
ความแตกต่างพื้นฐานระหว่าง Cast () และ Convert () คืออะไร?
RK Sharma

5
@RKSharma นั่นเป็นคำถามที่สมบูรณ์แบบสำหรับคุณที่จะถามใน stackoverflow.com หรือค้นหาไซต์นี้เพื่อดูว่ามีใครตอบแล้วหรือยัง
aarona

1
ฉันไม่รู้ว่าทำไมฉันถึงเลือกnvarcharน้อยกว่าnvarchar(50)มาก ตัวระบุที่ไม่ซ้ำกันเมื่อแปลงเป็นค่าข้อความจะถือว่าเป็น hex-dash-36
user2864740

10
ตามคำตอบอื่น ๆ คุณสามารถย่อสิ่งนี้cast(RequestID as char(36))ได้
Frank Tan

94

เป็นไปได้ที่จะใช้ฟังก์ชันแปลงที่นี่ แต่ 36 อักขระก็เพียงพอที่จะเก็บค่าตัวระบุที่ไม่ซ้ำกัน:

convert(nvarchar(36), requestID) as requestID

2
เนื่องจากความยาวคงที่แม้ varchar (36) ก็เพียงพอแล้ว
gdbdable

11
คุณพูดว่า "คงที่" และ "varchar" ในประโยคเดียวกัน ... แล้วยังไงchar(36)? คุณอาจใช้nchar(36)แต่เนื่องจาก GUID ไม่มี Unicode จึงไม่ซื้ออะไรเลย ตรงกันข้ามกับการดำเนินงานโดยทั่วไปมักจะเร็วกว่าchar varchar
r2evans


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.