Json 存储过程的输入

Json input of a stored Procedure

我有一个输入为 JSON 的存储过程,是否可以使用 JSON 作为存储过程的输入?我该怎么做?

CREATE PROCEDURE [warm].[stored _table]  
 (
  @Json NVARCHAR(MAX)
  )
  AS
  BEGIN
  SET NOCOUNT ON;
  BEGIN TRY
       BEGIN

        WITH JsonToTable AS 
        (
            SELECT * FROM OPENJSON (@Json) WITH (
                [type] [nvarchar](100), 
                [source] [nvarchar](38), 
                [time] [nvarchar](28), 
                [ID] [varchar](50) '$.data.ID',
                [RegionCode] [varchar](10)'$.data.RegionCode'
                [DueDate] [datetime2](7)'$.data.DueDate',
                [SchedulStartDate] [datetime2](7)'$.data.SchedulStartDate',
            
                
            )
        )

        MERGE [warm].[table] AS TARGET 
        USING JsonToTable AS SOURCE 
        ON (TARGET.ID = SOURCE.ID)
        WHEN MATCHED THEN
         UPDATE SET 
        TARGET.[RegionCode]                 = (SOURCE.[RegionCode]
        TARGET.[DueDate]                 = [dbo].[ufn_cast_string_to_date](SOURCE.[DueDate])
       ,TARGET.[SchedulStartDate]        = [dbo].[ufn_cast_string_to_date](SOURCE.[SchedulStartDate])
      
        
        
        WHEN NOT MATCHED THEN
            INSERT 
                (
                 [SourceID]
                ,[ID]
                ,[RegionCode]
                ,[DueDate]
                ,[SchedulStartDate])
            VALUES
                (
                 1
                ,[ID]
                ,[RegionCode]
                ,[dbo].[ufn_cast_string_to_date](SOURCE.[DueDate])
                ,[dbo].[ufn_cast_string_to_date](SOURCE.[SchedulStartDate])
     );                 

    END
    END TRY
   
    END

我想用下面的请求来执行它:

    DECLARE @return_value int
    EXEC    @return_value = [warm].[usp_upsert_warm_table]
    @Json = N'{
"type" : "table",
"source" : "informations",
"time" : "2018-04-05T17:31:00Z",
"id" : "A11-111-111",
"data" : {"
 "ID":"123-56",
 "RegionCode":"2",
 "DueDate":"2020-13-14T10:54:00",
 "SchedulStartDate":"2020-12-14T10:54:00" 
  }'}

我收到此消息错误:

JSON text is not properly formatted. Unexpected character '.' is found at position 480.**

这是有效输入:

 DECLARE    @return_value int
 EXEC   @return_value = [warm].[usp_upsert_warm_table]
    @Json = N'
 {  
  "type" : "table1",
  "source" : "",
  "id" : "A111-111-11",
  "time" : "2020-12-14 10:54:00",
  "data" :{
  "ApplicationID":"INFORMATIONS",
  "ID":"157faf1657c-100",
  "RegionCode":"2",
  "DueDate":"2020-12-14 10:54:00",
  "SchedulStartDate":"2020-12-14 10:54:00"}'} 

对于我输入的日期:2020-12-14 10:54:00 我删除了中间的 T 对于我的 S.P :我将我的变量类型从 datetime 更改为 varchar :

CREATE PROCEDURE [warm].[usp_upsert_warm_table]  
...
    
            [ID] [varchar](50) '$.data.ID',
            [RegionCode] [varchar](10)'$.data.RegionCode'
            [DueDate] [varchar](40)'$.data.DueDate',
            [SchedulStartDate] [varchar](10)'$.data.SchedulStartDate',
        
  ....