2011-04-12 817 views
8

我得到以下错误,当我运行SQL查询,同时从一个表复制到另一个数据,SQL服务器 - 结果空间不足uniqueidentifier值转换为char

消息8170,级别16,状态2,行2 结果空间不足以将 uniqueidentifier值转换为char。

我的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(),如果我拿出和用它正在工作的一些字符串替换它。

我很感激任何帮助。提前致谢。

回答

19

guid需要36个字符(因为破折号)。您只能提供32个字符的列。不够,因此错误。

+4

而且顺便说一句,你应该使用'uniqueidentifier'列式存储的GUID,不'字(36)'(var是不需要的,因为它不可变,是吗?)。 'uniqueidentifier'只需要16个字节的存储空间,而不需要36个字符表示的guid。 – 2011-04-12 00:35:07

+0

简单但直截了当的答案。 – bot 2016-02-24 10:28:00

3

需要使用3中的一个替代方案

1,A唯一标识符列,其在内部存储它作为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 
相关问题