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个字符的列.不够,因此错误.
您需要使用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)
当我尝试在 GUID 上执行简单的字符串连接时收到此错误。显然 aVARCHAR不够大。
我必须改变:
SET @foo = 'Old GUID: {' + CONVERT(VARCHAR, @guid) + '}';
到:
SET @foo = 'Old GUID: {' + CONVERT(NVARCHAR(36), @guid) + '}';
...一切都很好。非常感谢之前对此问题的回答!
| 归档时间: |
|
| 查看次数: |
28075 次 |
| 最近记录: |