SQL Server: conversion de UniqueIdentifier en chaîne dans une instruction case

136

Nous avons une table de journal qui a une colonne de message qui a parfois une trace de pile d'exceptions. J'ai quelques critères qui déterminent si le message contient cela. Nous ne voulons pas montrer ces messages au client, mais plutôt un message comme:

Une erreur interne s'est produite. Contactez-nous avec le code de référence xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

où xxx etc est une colonne guid dans le tableau. J'écris un proc stocké comme ceci:

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

RequestIDest un type de données Guid dans SQL Server et n'est pas converti en chaîne ici. J'ai vu du code sur la façon de convertir un Guid en chaîne, mais il est multi-lignes et je ne pense pas que cela fonctionnerait dans une instruction case. Des idées?

Aarona
la source

Réponses:

257

Je pense avoir trouvé la réponse:

convert(nvarchar(50), RequestID)

Voici le lien où j'ai trouvé cette information:

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

Aarona
la source
21
Alternativement, cast (RequestID as varchar (50))
MK_Dev
3
Quelle est la différence fondamentale entre cast () et convert ()?
RK Sharma
5
@RKSharma, c'est une question parfaite à poser sur stackoverflow.com ou à rechercher sur ce site pour voir si quelqu'un y a déjà répondu.
aarona
1
Je ne sais pas pourquoi je choisirais nvarchar, encore moins nvarchar(50). Un identifiant unique, lorsqu'il est converti en une valeur de texte est traité dans hex-dash-36.
user2864740
9
Comme le disent d'autres réponses, vous pouvez condenser cela cast(RequestID as char(36)).
Frank Tan
90

Il est possible d'utiliser la fonction de conversion ici, mais 36 caractères suffisent pour contenir la valeur d'identifiant unique:

convert(nvarchar(36), requestID) as requestID
Philippe Grondier
la source
2
car la longueur est fixe même varchar (36) suffit ici
gdbdable
11
Vous dites "fixed" et pourtant "varchar" dans la même phrase ... que diriez-vous char(36)? Vous pouvez également utiliser nchar(36), mais comme un GUID ne contient pas d'Unicode, il ne vous achète rien. À l'inverse, les opérations avec charsont généralement plus rapides que varchar.
r2evans
47

À mon avis, uniqueidentifier/ GUID n'est ni un varcharni un nvarcharmais un char(36). Par conséquent, j'utilise:

CAST(xyz AS char(36))
Silvan Hofer
la source
8

Au lieu de Str(RequestID), essayezconvert(varchar(38), RequestID)

AussieAtHeart
la source