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

Sam*_*ith 13 sql sql-server newid

我在将数据从一个表复制到另一个表时运行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
Run Code Online (Sandbox Code Playgroud)

我的创建表脚本是,

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)
Run Code Online (Sandbox Code Playgroud)

我确信NEWID()存在一些问题,如果我拿出并用一些字符串替换它正在工作.

我感谢任何帮助.提前致谢.

Rem*_*anu 29

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

  • 顺便说一句,你应该使用`uniqueidentifier`列类型来存储guid,而不是'character(36)`(var不是必需的,因为它不是变量,是吗?).`uniqueidentifier`只需要16个字节用于存储,而guid的字符表示需要36个字节. (7认同)

Ric*_*iwi 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)
Run Code Online (Sandbox Code Playgroud)

2,不推荐将字段更改为char(36)以使其符合格式,包括破折号.

CREATE TABLE [dbo].[cust_info](
    [uid] char(36) NOT NULL,
    [first_name] [varchar](100) NULL,
    [last_name] [varchar](100) NULL)
Run Code Online (Sandbox Code Playgroud)

3,不建议不要使用破折号存储它,只需要32个字符的组件

INSERT INTO dbo.cust_info (
uid,
first_name,
last_name
)
SELECT
replace(NEWID(),'-',''),
first_name,
last_name
FROM dbo.tmp_cust_info
Run Code Online (Sandbox Code Playgroud)


Jas*_*sel 6

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

我必须改变:

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

到:

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

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