如何在使用FROM opensjon时将newid()插入到列中

时间:2018-04-25 18:53:46

标签: json sql-server tsql datatables

我想在表格中插入newid()。它不是在JSON对象本身中提供的,所以我需要以某种方式传递它。我似乎无法做到这一点......

declare @jsonString nvarchar(max),

--sample incoming data, JSON object
set @jsonString = '{

    "PosTitle": "Tech",
    "PosCode": "699887",
    "FileName": "clickme.exe",

}'

我可以成功解析JSON字符串,并将其插入临时表:

    --establish temp table
CREATE TABLE #tblDestination(
    [id] [uniqueidentifier] default newsequentialid(),
    [PosTitle] [varchar](80) NULL,
    [PosCode] [varchar](5) NULL,
    [FileName] [varchar](60) NULL,

)

--parse the JSON string
--and insert it into the temp table
insert into #tblDestination
select *
from openjson(@jsonString, '$')
with 
(

    newid(), --I need to insert a newid() into the [id column]
    PosTitle varchar(80) '$.PosTitle',
    PosCode varchar(5) '$.PosCode',
    [FileName] varchar(60) '$.FileName',


)

我有点可以让它发挥作用......源中的列必须与目标完美对齐。源没有newid(),所以我需要构建一个并传递它...但我无法弄清楚如何做到这一点。

我的理解是with是CTE的一部分。

我试图避免为每个键/值声明一个var,并通过select JSON_VALUE手动拔出每个键。

1 个答案:

答案 0 :(得分:1)

OpenJson是一个表值函数,只需从中选择NewId()*即可。 此外,在将数据插入表时始终指定列列表:

insert into #tblDestination ([id], [PosTitle], [PosCode], [FileName])
select newid(), *
from openjson(@jsonString, '$')
with 
(
    PosTitle varchar(80) '$.PosTitle',
    PosCode varchar(5) '$.PosCode',
    [FileName] varchar(60) '$.FileName'
)