将JSON插入SQL Server表时出错:意外字符“”

时间:2018-04-10 16:40:47

标签: json sql-server

使用Microsoft SQL Server 2016(RTM)标准版,我正在尝试使用SQL Server代理作业将JSON加载到SQL Server表中,并收到以下错误:

  

JSON文本格式不正确。在位置508找到意外的字符“”。[SQLSTATE 42000](错误13609)。

但是当我以T-SQL的形式运行时,它会插入没有错误的数据。

DECLARE @return_value int,
    @responseText nvarchar(MAX),
    @json nvarchar(MAX)

EXEC    @return_value = [dbo].[HTTPRequest]
    @URI = N'http://flexapi.foresightgps.com/ForesightFlexAPI.ashx',
    @methodName = N'post',
    @requestBody =     N'{"method":"GetTagTempHistory","conncode":"PROVIDER","code":"USERNAME","wsuserid":"USERID" }',
    @SoapAction = 'MSXML2.ServerXMLHTTP',
    @UserName = N'USERNAME',
    @Password = N'PASSWORD',
    @responseText = @responseText OUTPUT
--SELECT    @responseText as '@responseText';
  SELECT    @json= VALUE FROM OPENJSON(@responseText) WHERE [key]='ForesightFlexAPI';
INSERT INTO Localizado([TransactionID],[TrueTime],[Temp],[Name],[yLat],[xLong],[Speed],[Ignition],[Location])
SELECT [TransactionID],[TrueTime],[Temp],[Name],[yLat],[xLong],[Speed],[Ignition],[Location]
FROM OPENJSON(@json,'lax $.DATA')
WITH( TransactionID nvarchar(20) '$.TransactionID',
      TrueTime NVARCHAR(50) '$.TrueTime',
      Temp decimal(9,4) '$.Temp',
      Name nvarchar(50) '$.Name',
      yLat nvarchar(50) '$.yLat',
      xLong nvarchar(50) '$.xLong',
      Speed nvarchar(20) '$.Speed',
      Ignition nvarchar(20) '$.Ignition',
      Location nvarchar(500) 'lax $.Location'
      )

1 个答案:

答案 0 :(得分:0)

问题是从SQL Server代理作业而不是从SSMS执行时,从API返回的json字符串被截断了。 So the unexpected character will always be something near 512.

解决方案是在执行存储过程之前先SET TEXTSIZE -1。 SQL Server代理作业的命令应如下所示:

SET TEXTSIZE -1
EXECUTE [your stored procedure]

如果您对两者之间的差异感到好奇,可以将@responseText插入到临时表中,并且如果SET TEXTSIZE -1包含多个{ 512个字符。