为什么这个SQL CAST不起作用?

时间:2010-03-16 16:27:15

标签: tsql sql-server sql-server-2000

我在SQL Server 2000表中有一个nvarchar(50)列,定义如下:

TaskID nvarchar(50) NULL

我需要使用NEWID()函数使用随机SQL GUID填充此列(我无法将列类型更改为uniqueidentifier)。

我试过了:

UPDATE TaskData SET TaskID = CAST(NEWID() AS nvarchar)

但我收到以下错误:

  

Msg 8115,Level 16,State 2,Line 1   算术溢出错误转换   表达式数据类型为nvarchar。

我也尝试过:

UPDATE TaskData SET TaskID = CAST(NEWID() AS nvarchar(50))

但后来出现了这个错误:

  

Msg 8152,Level 16,State 6,Line 1   字符串或二进制数据   截断。

我不明白为什么这不起作用,但确实如此:

DECLARE @TaskID nvarchar(50)
SET @TaskID = CAST(NEW() AS nvarchar(50))

我也尝试了CONVERT(nvarchar, NEWID())CONVERT(nvarchar(50), NEWID()),但也遇到了同样的错误。

更新

好的,我的视力正在上升,桌子上的柱子大小是nvarchar(32)而不是50岁。对于浪费时间而言,最深切的道歉并感谢所有答案。

4 个答案:

答案 0 :(得分:15)

如果在转换或转换期间未指定varchar / nvarchar的大小,则默认为30个字符。你需要36个字符才能将guid转换为字符串。这就是你得到错误的原因。

其中任何一个都可行:

Select Cast(NewId() as nvarchar(36)), CONVERT(nvarchar(36), NEWID())

答案 1 :(得分:13)

这个测试脚本对我来说很好......我只能建议你的TaskId不像你说的那样是NVARCHAR(50)吗?尝试使用sp_columns来检查......

CREATE Table #TaskData (TaskId NVARCHAR(50))
INSERT INTO #TaskData (TaskId) SELECT CONVERT(NVARCHAR(50), NEWID())
UPDATE #TaskData SET TaskId = CONVERT(NVARCHAR(50), NEWID())
DROP TABLE #TaskData

答案 2 :(得分:3)

请尝试以下演员:

CAST(NEWID() AS varchar(255))

答案 3 :(得分:0)

使用varchar数据类型,nvarchar需要双倍大小