2011-04-12 88 views
8

que estoy recibiendo por debajo de error al ejecutar la consulta SQL al copiar los datos de una tabla a otra,servidor SQL - Espacio de resultados insuficiente para convertir uniqueidentifier valor a char

Msg 8170, nivel 16, estado 2, línea 2 Espacio de resultado insuficiente para convertir valor de identificador único en char.

Mi consulta SQL es,

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

Mi crear secuencias de comandos de la tabla son,

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) 

Estoy seguro de que hay algún problema con NEWID(), si tomo y reemplácelo con alguna cuerda que esté funcionando.

Agradezco cualquier ayuda. Gracias por adelantado.

Respuesta

19

Un guid necesita 36 caracteres (debido a los guiones). Usted solo proporciona una columna de 32 caracteres. No es suficiente, de ahí el error.

+4

Y por cierto, se debe utilizar 'uniqueidentifier' tipo de columna para almacenar guids, no carácter' (36) '(var no es necesario ya que no es variable, ¿verdad?). 'uniqueidentifier' solo necesita 16 bytes para el almacenamiento, en oposición a 36 necesarios para la representación de caracteres de un guid. –

+0

respuesta simple pero directa. – bot

3

Es necesario utilizar una de las 3 alternativas

1, una columna uniqueidentifier, que almacena internamente como 16 bytes. Cuando selecciona de esta columna, automáticamente la muestra para la pantalla usando el formato 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, no se recomienda Cambie el campo a char (36) para que se ajuste al formato, incluyendo guiones.

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

3, no se recomienda almacenarla sin los guiones, como sólo los componentes de 32 caracteres

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