SQL Server: convertendo UniqueIdentifier em string em uma instrução de caso

136

Temos uma tabela de log que possui uma coluna de mensagem que às vezes possui um rastreamento de pilha de exceção. Eu tenho alguns critérios que determinam se a mensagem tem isso. Não queremos mostrar essas mensagens ao cliente, mas sim uma mensagem como:

Ocorreu um erro interno. Entre em contato conosco com o código de referência xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

onde xxx etc é uma coluna de guia na tabela. Estou escrevendo proc armazenado 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

RequestIDé um tipo de dados Guid no SQL Server e não converte em string aqui. Eu já vi algum código sobre como converter um Guid em string, mas é multi-alinhado e não acho que funcionaria em uma declaração de caso. Alguma ideia?

aarona
fonte

Respostas:

257

Eu acho que encontrei a resposta:

convert(nvarchar(50), RequestID)

Aqui está o link onde encontrei esta informação:

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

aarona
fonte
21
Alternativamente, fundido (RequestID como VARCHAR (50))
MK_Dev
3
Qual é a diferença básica entre cast () e convert ()?
RK Sharma
5
@RKSharma é uma pergunta perfeita para você perguntar no stackoverflow.com ou pesquisar neste site para ver se alguém já respondeu.
AaronA
1
Não sei por que escolheria nvarchar, muito menos nvarchar(50). Um identificador exclusivo, quando convertido em um valor de texto, é tratado em hex-dash-36.
user2864740
9
Como outras respostas dizem, você pode condensar isso cast(RequestID as char(36)).
Frank Tan
90

É possível usar a função convertida aqui, mas 36 caracteres são suficientes para manter o valor do identificador exclusivo:

convert(nvarchar(36), requestID) as requestID
Philippe Grondier
fonte
2
porque comprimento é fixo, mesmo VARCHAR (36) é suficiente aqui
gdbdable
11
Você diz "fixo" e ainda "varchar" na mesma frase ... que tal char(36)? Você também pode usar nchar(36), mas como um GUID não contém unicode, ele não compra nada. Por outro lado, as operações com charsão geralmente mais rápidas que varchar.
R2evans
47

Na minha opinião, uniqueidentifier/ GUID não é um varcharnem um nvarcharmas um char(36). Portanto, eu uso:

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

Em vez de Str(RequestID), tenteconvert(varchar(38), RequestID)

AussieAtHeart
fonte