Sql Server-结果空间不足,无法将uniqueidentifier值转换为字符

Sql Server-结果空间不足,无法将uniqueidentifier值转换为字符,sql,sql-server,newid,Sql,Sql Server,Newid,当我在将数据从一个表复制到另一个表时运行sql查询时,出现以下错误: Msg 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](

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

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


谢谢你的帮助。提前感谢。

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

您需要使用三种备选方案之一

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

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

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

我必须改变:

SET@foo='旧GUID:{'+CONVERT(VARCHAR,@GUID)+'}'

致:

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


…一切都很好。非常感谢之前的回答

顺便说一句,您应该使用
uniqueidentifier
列类型来存储guid,而不是
字符(36)
(不需要var,因为它不是变量,是吗?)
uniqueidentifier
只需要16个字节的存储空间,而guid的字符表示需要36个字节。简单而直接的答案。