22

当我在将数据从一个表复制到另一个表时运行 sql 查询时出现以下错误,

消息 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()存在一些问题,如果我取出并用它正在工作的一些字符串替换它。

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

4

4 回答 4

39

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

于 2011-04-12T00:14:34.723 回答
7

您需要使用 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
于 2011-04-12T00:45:11.087 回答
3

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

我不得不改变:

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

至:

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

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

于 2020-05-12T20:36:40.647 回答
2

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

于 2018-10-26T06:27:32.530 回答