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

Kev*_*Kev 10 t-sql sql-server sql-server-2000

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

TaskID nvarchar(50) NULL
Run Code Online (Sandbox Code Playgroud)

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

我试过这个:

UPDATE TaskData SET TaskID = CAST(NEWID() AS nvarchar)
Run Code Online (Sandbox Code Playgroud)

但我收到以下错误:

消息8115,级别16,状态2,行1算术溢出错误将表达式转换为数据类型nvarchar.

我也尝试过:

UPDATE TaskData SET TaskID = CAST(NEWID() AS nvarchar(50))
Run Code Online (Sandbox Code Playgroud)

但后来出现了这个错误:

消息8152,级别16,状态6,行1字符串或二进制数据将被截断.

我不明白为什么这不起作用,但这样做:

DECLARE @TaskID nvarchar(50)
SET @TaskID = CAST(NEW() AS nvarchar(50))
Run Code Online (Sandbox Code Playgroud)

我也试过CONVERT(nvarchar, NEWID()),CONVERT(nvarchar(50), NEWID())但得到了同样的错误.

更新:

好吧,我的视力正在上升,桌子上的柱子大小nvarchar(32)不是50.最浪费的时间浪费道歉并感谢所有的答案.

G M*_*ros 17

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

这些都可以工作:

Select Cast(NewId() as nvarchar(36)), CONVERT(nvarchar(36), NEWID())
Run Code Online (Sandbox Code Playgroud)

  • 在我看来,这是最准确的答案. (2认同)

Rob*_*Day 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
Run Code Online (Sandbox Code Playgroud)