Sql Server - 没有足够的结果空间将uniqueidentifier值转换为char

时间:2011-04-12 00:10:34

标签: sql sql-server newid

我在将数据从一个表复制到另一个表时运行sql查询时遇到错误

  

Msg 8170,Level 16,State 2,Line 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()存在一些问题,如果我拿出并用一些字符串替换它就可以了。

我感谢任何帮助。提前谢谢。

4 个答案:

答案 0 :(得分:26)

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

答案 1 :(得分:6)

您需要使用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

答案 2 :(得分:1)

从varchar(32)-> varchar(36)增加uid列的长度 因为Guid需要36个字符 Guid.NewGuid()。ToString()-> 36个字符 输出:12345678-1234-1234-1234-123456789abc

答案 3 :(得分:1)

当我尝试在GUID上执行简单的字符串连接时,收到此错误。显然VARCHAR不够大。

我不得不改变:

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

收件人:

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

...一切都很好。非常感谢对此的先前回答!