2010-04-23 6 views
1

J'essaie de lancer un AuctionId qui est un UNIQUEIDENTIFIER à un varchar(36), puis de nouveau à UNIQUEIDENTIFIER. Aidez-moi, s'il vous plaît.De varchar (36) à UNIQUEIDENTIFIER

CAST((SUBSTRING(CAST([AuctionId] as VARCHAR(36)), 0, 35) + '1') AS UNIQUEIDENTIFIER) 

Mais je continue à recevoir cette erreur:

Msg 8169, Level 16, State 2, Line 647 Conversion failed when converting from a character string to uniqueidentifier.

Merci à l'avance

+3

BTW - la modification d'un chiffre quelconque dans une représentation UUID ne donne pas une valeur qui est sûr à utiliser. Si vous essayez de créer un nouvel UUID, utilisez 'NEWID()' comme @RobinDay mentionné. –

Répondre

5

Le '1' n'est pas le problème. Vous essayez évidemment de changer le dernier caractère du GUID en 1. Je ne sais pas pourquoi, mais c'est votre condition.

Votre problème concerne la sous-chaîne. Dans TSQL, la sous-chaîne utilise un index commençant à 1 et non 0 comme en C ou C#. Cela signifie que votre instruction de sous-chaîne renvoie une chaîne de 34 caractères (+1 caractères de plus fait 35, et on vous dit qu'une chaîne de 35 caractères n'est pas un GUID, ce qui est juste).

il suffit de changer le ,0,35-1,35

3

Votre erreur est due à votre + '1' et votre SUBSTRING. Qu'est-ce que vous avez là-dedans?

Cela fonctionne bien

SELECT cast((cast(NEWID() as varchar(36))) as UNIQUEIDENTIFIER) 

EDIT: Ok, donc si vous voulez remplacer le dernier caractère avec un « 1 », alors c'est la solution

SELECT CAST(SUBSTRING(CAST(NEWID() AS VARCHAR(36)), 1, 35) + '1' AS UNIQUEIDENTIFIER) 

La seule différence est que SUBSTRING dans SQL commence à la position 1, pas la position 0 comme vous l'aviez.

P.S. C'est un code dangereux. La sortie n'est plus un GUID car elle ne sera pas conforme à l'algorithme utilisé pour générer le GUID. Cela pourrait (bien que peu probable) entraîner une collision avec les GUID, ce qui pourrait potentiellement causer toutes sortes de problèmes.

+0

Il essaie de remplacer le dernier chiffre de la représentation hexadécimale du GUID par un "1" je présume? Je ne sais pas pourquoi ... –

2

Comme d'autres l'ont observé, on ne sait pas pourquoi vous voulez faire ce que vous faites.

Une alternative à SUBSTRING est la commande STUFF:

SELECT stuff(cast([AuctionId] as varchar(36)),36,1,'1')

Questions connexes