如何通过Azure Stream Analytics作业将原始JSON数据写入Azure SQL数据库?
解决Azure Stream Analytics保存原始JSON到SQL数据库的问题
要直接把IoT Hub传来的完整原始JSON存入Azure SQL数据库,你可以利用Stream Analytics的ToString()函数,将整个输入记录(也就是原始JSON消息体)转换为字符串,然后插入到数据库的对应列中。具体步骤如下:
1. 准备SQL数据库表结构
首先确保你的SQL表有一个足够容纳长JSON字符串的列,建议定义为NVARCHAR(MAX),同时可以保留自增的RecID列(匹配你示例中的需求):
CREATE TABLE RawTelemetry ( RecID INT IDENTITY(1,1) PRIMARY KEY, JsonValue NVARCHAR(MAX) NOT NULL );
2. 修改Stream Analytics查询
在你的SA作业中,替换原来的解析查询,改用以下语句——直接将整个IoT Hub输入的消息体转换为字符串,然后写入SQL表:
SELECT ToString([iothub]) AS JsonValue INTO [YourSQLDatabaseOutput] FROM [YourIoTHubInput]
这里的[iothub]是你SA作业中IoT Hub输入的别名,[YourSQLDatabaseOutput]是你配置的SQL输出别名,根据实际名称替换即可。
3. 验证效果
运行这个作业后,SQL表中的JsonValue列就会完整存储每条IoT Hub传来的原始JSON数据,和你期望的结果一致:
RecID JsonValue 1 {"gtwid": "0013A200419F2BAA","devid": "0013A200418975CC","telemetry": {"t1": {"id": "a698ab4d2001","avg": 26,"max": 26,"min": 26}}}
额外注意事项
- 一定要用
NVARCHAR(MAX)类型存储JSON,避免因字符串长度超出限制导致数据截断,同时兼容JSON中的Unicode字符。 - 如果你的IoT Hub消息包含系统属性(如入队时间),且需要一并保存,可以结合
GetMetadataPropertyValue函数把属性和消息体拼接成JSON;但如果只需要原始消息体,上面的查询就足够了。 - 可以在SA的测试查询功能中先验证输出,确认
ToString()返回的是完整的原始JSON字符串后再正式运行作业。
内容的提问来源于stack exchange,提问作者Radim Pluskal
相关产品推荐
相关产品推荐

