SQL Server: convertir UniqueIdentifier a cadena en una declaración de caso

136

Tenemos una tabla de registro que tiene una columna de mensaje que a veces tiene un seguimiento de pila de excepción. Tengo algunos criterios que determinan si el mensaje tiene esto. No queremos mostrar estos mensajes al cliente, sino que tenemos un mensaje como:

Error interno ocurrido. Contáctenos con el código de referencia xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

donde xxx, etc. es una columna guid en la tabla. Estoy escribiendo un proceso almacenado como este:

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

RequestIDes un tipo de datos Guid en SQL Server y no se convierte en cadena aquí. He visto un código sobre cómo convertir un Guid en una cadena, pero tiene varias líneas y no creo que funcione en una declaración de caso. ¿Algunas ideas?

aarona
fuente

Respuestas:

257

Creo que encontré la respuesta:

convert(nvarchar(50), RequestID)

Aquí está el enlace donde encontré esta información:

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

aarona
fuente
21
Alternativamente, emitir (RequestID como varchar (50))
MK_Dev
3
¿Cuál es la diferencia básica entre cast () y convert ()?
RK Sharma
55
@RKSharma, es una pregunta perfecta para usted en stackoverflow.com o busque en este sitio para ver si alguien ya lo ha respondido.
aarona
1
No sé por qué elegiría nvarchar, mucho menos nvarchar(50). Un identificador único, cuando se convierte en un valor de texto, se trata en hex-dash-36.
user2864740
9
Como dicen otras respuestas, puedes condensar esto cast(RequestID as char(36)).
Frank Tan
90

Aquí es posible usar la función de conversión, pero 36 caracteres son suficientes para mantener el valor del identificador único:

convert(nvarchar(36), requestID) as requestID
Philippe Grondier
fuente
2
porque la longitud es fija, incluso varchar (36) es suficiente aquí
gdbdable
11
Dices "fijo" y aún "varchar" en la misma oración ... ¿qué tal char(36)? También puede usarlo nchar(36), pero como un GUID no contiene unicode, no le compra nada. Por el contrario, las operaciones con charson generalmente más rápidas que varchar.
r2evans
47

En mi opinión, uniqueidentifier/ GUID no es ni un varcharni un nvarcharsino un char(36). Por eso uso:

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

En lugar de Str(RequestID)intentarconvert(varchar(38), RequestID)

AussieAtHeart
fuente