我在将数据从一个表复制到另一个表时运行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()存在一些问题,如果我拿出并用一些字符串替换它就可以了。
我感谢任何帮助。提前谢谢。
答案 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) + '}';
...一切都很好。非常感谢对此的先前回答!