如何在使用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
相关产品推荐
相关产品推荐

