You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在使用OPENJSON插入数据时为列传入NEWID()值

解决方案:手动插入NEWID()替代默认newsequentialid()

我懂你的需求啦——你不想依赖临时表定义里的newsequentialid()默认值,而是要主动插入NEWID()生成的唯一标识符,而且传入的JSON里并没有这个id字段对吧?下面给你两个简单可行的实现方式:

方法一:插入时直接指定id字段值

这个方法最直接,不需要修改原JSON内容,在INSERT语句里显式把NEWID()赋值给id字段,其余字段从JSON解析即可:

declare @jsonString nvarchar(max);
set @jsonString = '{ "PosTitle": "Tech", "PosCode": "699887", "FileName": "clickme.exe" }'

-- 建立临时表(补全你的字段定义)
CREATE TABLE #tblDestination( 
    [id] [uniqueidentifier], 
    [PosTitle] nvarchar(100),
    [PosCode] nvarchar(20),
    [FileName] nvarchar(255)
)

-- 核心插入逻辑:显式指定id为NEWID(),其余字段从JSON提取
INSERT INTO #tblDestination(id, PosTitle, PosCode, FileName)
SELECT NEWID(), PosTitle, PosCode, FileName
FROM OPENJSON(@jsonString)
WITH (
    PosTitle nvarchar(100),
    PosCode nvarchar(20),
    FileName nvarchar(255)
)

说明

  • 这里完全绕过了表的默认值设置,直接在插入时生成并传入NEWID()
  • 如果你的#tblDestination表原来的id字段有默认值,显式指定值会自动覆盖默认行为,刚好符合你的需求

方法二:先给JSON添加id字段再插入

如果你希望JSON数据本身包含id字段后再进行插入操作,可以用JSON_MODIFY动态给原JSON添加id键值对:

declare @jsonString nvarchar(max);
set @jsonString = '{ "PosTitle": "Tech", "PosCode": "699887", "FileName": "clickme.exe" }'

-- 给原JSON添加id字段,值为NEWID()生成的唯一标识符
SET @jsonString = JSON_MODIFY(@jsonString, '$.id', NEWID())

-- 建立临时表(补全你的字段定义)
CREATE TABLE #tblDestination( 
    [id] [uniqueidentifier], 
    [PosTitle] nvarchar(100),
    [PosCode] nvarchar(20),
    [FileName] nvarchar(255)
)

-- 此时可以直接解析包含id的JSON进行插入
INSERT INTO #tblDestination
SELECT *
FROM OPENJSON(@jsonString)
WITH (
    id uniqueidentifier,
    PosTitle nvarchar(100),
    PosCode nvarchar(20),
    FileName nvarchar(255)
)

说明

  • JSON_MODIFY会修改原JSON字符串,添加一个名为id的顶级键,值就是NEWID()生成的唯一值
  • 之后的插入操作就和处理包含所有字段的JSON一样,不需要额外指定字段

内容的提问来源于stack exchange,提问作者NamedArray

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:31:10