Sql Server - недостаточно места для результата, чтобы преобразовать значение uniqueidentifier в char

Я получаю ошибку ниже, когда я запускаю SQL-запрос при копировании данных из одной таблицы в другую,

Сообщение 8170, Уровень 16, Состояние 2, Строка 2 Недостаточно места для результата, чтобы преобразовать значение уникального идентификатора в символ.

Мой SQL-запрос,

INSERT INTO dbo.cust_info (
uid,
first_name,
last_name
)
SELECT
NEWID(),
first_name,
last_name
FROM dbo.tmp_cust_info

Мои сценарии создания таблицы:

CREATE TABLE [dbo].[cust_info](
    [uid] [varchar](32) NOT NULL,
    [first_name] [varchar](100) NULL,
    [last_name] [varchar](100) NULL)

CREATE TABLE [dbo].[tmp_cust_info](
    [first_name] [varchar](100) NULL,
    [last_name] [varchar](100) NULL)

Я уверен, что есть некоторая проблема с NEWID (), если я вытащу его и заменим на какую-то строку, она работает.

Я ценю любую помощь. Заранее спасибо.

5 ответов

Гиду нужно 36 символов (из-за тире). Вы предоставляете только 32-символьный столбец. Недостаточно, отсюда и ошибка.

Вам нужно использовать один из 3 вариантов

1, столбец uniqueidentifier, который хранит его внутри как 16 байтов. Когда вы выбираете из этого столбца, он автоматически отображает его для отображения в формате 8-4-4-4-12.

CREATE TABLE [dbo].[cust_info](
    [uid] uniqueidentifier NOT NULL,
    [first_name] [varchar](100) NULL,
    [last_name] [varchar](100) NULL)

2, не рекомендуется. Измените поле на char(36), чтобы оно соответствовало формату, включая тире.

CREATE TABLE [dbo].[cust_info](
    [uid] char(36) NOT NULL,
    [first_name] [varchar](100) NULL,
    [last_name] [varchar](100) NULL)

3, не рекомендуется хранить его без черточек, так как только 32-символьные компоненты

INSERT INTO dbo.cust_info (
uid,
first_name,
last_name
)
SELECT
replace(NEWID(),'-',''),
first_name,
last_name
FROM dbo.tmp_cust_info

Я получил эту ошибку, когда пытался выполнить простую конкатенацию строк для GUID. По-видимомуVARCHAR недостаточно большой.

Пришлось поменять:

SET @foo = 'Old GUID: {' + CONVERT(VARCHAR, @guid) + '}';

кому:

SET @foo = 'Old GUID: {' + CONVERT(NVARCHAR(36), @guid) + '}';

... и все было хорошо. Огромное спасибо за предыдущие ответы на этот вопрос!

Вы можете попробовать это. Это сработало для меня.

Укажите длину для VARCHAR при приведении/преобразовании значения. Для уникального идентификатора используйте VARCHAR(36), как показано ниже:

      SELECT Convert (varchar(36),NEWID()) AS NEWID

Длина по умолчанию для типа данных VARCHAR, если мы не указываем длину во время CAST/CONVERT, составляет 30..

1 кредит

Ссылка: https://social.msdn.microsoft.com/Forums/en-US/fb24a153-f468-4e18-afb8-60ce90b55234/insufficient-result-space-to-convert-uniqueidentifier-value-to-char?forum= транзакцияsql

Пожалуйста, увеличьте длину столбца uid из varchar(32) ->varchar(36), потому что guid принимает 36 символов. Guid.NewGuid().ToString() -> 36 символов: 12345678-1234-1234-1234-123456789abc

Другие вопросы по тегам