2010-03-16 2 views
6

У меня есть nvarchar(50) столбец в 2000 таблицы SQL Server определяется следующим образом:Почему этот SQL CAST не работает?

TaskID nvarchar(50) NULL 

Мне нужно, чтобы заполнить эту колонку со случайными SQL GUID, используя в NEWID() функцию (я не могу изменить тип столбца uniqueidentifier) ,

Я попытался это:

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

, но я получил следующее сообщение об ошибке:

Msg 8115, Level 16, State 2, Line 1 Arithmetic overflow error converting expression to data type nvarchar.

Я также попытался:

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

, но затем получил эту ошибку:

Msg 8152, Level 16, State 6, Line 1 String or binary data would be truncated.

Я не понимаю, почему это не работает, но это делает:

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

Я также попытался CONVERT(nvarchar, NEWID()) и CONVERT(nvarchar(50), NEWID()), но получил ту же ошибку.

Update:

Хорошо, мое зрение будет, размер колонки на столе nvarchar(32) не 50. Глубочайшие извинения за timewasting и спасибо за все ответы.

+0

У вас есть и триггеры на этой таблице? Вы можете получать сообщения об ошибках от триггера. sp_helpTrigger 'TaskData' –

+0

@GMastros - нет, проблема была в PEBKAC/PICNIC, более известном как код ID 10T. – Kev

ответ

11

Этот тестовый скрипт отлично работает для меня ... Я могу только предположить, что, возможно, ваш 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 
3

Пожалуйста, попробуйте следующий бросок:

CAST(NEWID() AS varchar(255)) 
0

использовать тип VARCHAR данных NVARCHAR необходим двойной размер

14

Если вы не указываете размер вашего VARCHAR/NVARCHAR во время броска или преобразования, то по умолчанию 30 символов. Для преобразования указателя в строку требуется 36 символов. Вот почему вы получаете ошибку.

Любой из них будет работать:

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

Мне кажется, это самый точный ответ. –

Смежные вопросы