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?

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


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

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))

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.