1

I am trying to cast an AuctionId that is a UNIQUEIDENTIFIER to an varchar(36) and then back to an UNIQUEIDENTIFIER. Please help me.

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

But I keep getting this error:

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

Thanks in advance

4

3 回答 3

5

“1”不是问题。您显然是在尝试将 GUID 的最后一个字符更改为 1。我不知道为什么,但这是您的要求。

您的问题与子字符串有关。在 TSQL 中,子字符串使用从 1 开始的索引,而不是像 C 或 C# 中的 0。这意味着您的子字符串语句实际上返回了 34 个字符的字符串(+1 个字符使 35,并且您被告知 35 个字符的字符串不是 GUID,这是正确的)。

只需更改,0,351,35

于 2010-04-23T12:50:14.660 回答
3

您的错误是由于您的 +'1' 和您的 SUBSTRING。你放那个东西有什么用?

这将正常工作

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

编辑:好的,所以如果你想用'1'替换最后一个字符,那么这就是解决方案

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

唯一的区别是 SQL 中的 SUBSTRING 从位置 1 开始,而不是从位置 0 开始。

PS 这是危险代码。输出不再是 GUID,因为它不符合用于生成 GUID 的算法。这可能(尽管不太可能)导致与 GUID 的冲突,这可能会导致各种问题。

于 2010-04-23T12:47:18.330 回答
2

正如其他人所观察到的,目前尚不清楚您为什么要做您正在做的事情。

一个替代方法SUBSTRINGSTUFF命令:

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

于 2010-04-23T12:54:47.547 回答