使用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'
)
答案 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个字符。