【问题标题】:MSSQL JSON auto to Go structMSSQL JSON 自动转 Go 结构
【发布时间】:2021-02-24 19:52:32
【问题描述】:

我正在尝试使用 MSSQL JSON AUTO 轻松地从查询转到 Go 结构。返回的数据看起来 jsony,但在将其从字符串转换为我想要的已知结构时遇到了麻烦。

func main() {
    type LOBData struct {
        COB_ID  int     `json:"COB_ID"`
        GrossLoss   float64     `json:"GrossLoss"`
    }

    type ResultData struct {
        YearID  int     `json:"YearID"`
        EventID int     `json:"EventID"`
        Modelcode int   `json:"modelcode"`
        Industry float64    `json:"Industry"`
        LOB []LOBData       `json:"y"`
    }

    db, err := sql.Open("sqlserver", ConnString())
    checkErr(err)
    defer db.Close()

    var result string
    err = db.QueryRow(`
        SELECT i.YearID, i.EventID, i.modelcode, totalloss as Industry, y.COB_ID, y.GrossLoss
        FROM  dbo.CS_IndustryLossv8_7938 AS i INNER JOIN
        dbo.Tb_YLT AS y ON i.YearID = y.YearID AND i.EventID = y.EventID AND i.modelcode = y.Modelcode
        where YLT_DVID=25
        FOR JSON AUTO`).Scan(&result)

    fmt.Println(result)
    YLT:= ResultData{}
    //var YLT []ResultData
    err=json.Unmarshal([]byte(result), &YLT)
    checkErr(err)
    fmt.Println(YLT)
}

fmt.Printlin(result) 打印:

[{"YearID":7687,"EventID":101900,"modelcode":41,"Industry":1.176648913256758e+010,"y":[{"COB_ID":5,"GrossLoss":6.729697615695682e+003}]},.....

但是 fmt.Println(YLT) 返回:

{0 0 0 0 []}

我收到“json 输入意外结束”的错误。

虽然 Go 没有字符串限制,但 MSSQL 有 8,000 个字符。如果我将查询限制在前 3 行并使用 var YLT []ResultData 它可以工作。无论如何要使用 MSSQL 和 Go 来做这件事,还是应该使用不同的服务器技术?

【问题讨论】:

  • 这能回答你的问题吗? How to convert JSON string to struct
  • 谢谢...导致问题的 MSSQL 字符串限制。不确定是否可以使用它,因为我想在哪里可以预加载相当大的数据集。
  • 为什么不呢? : ``` err = db.QueryRow("你的查询").Scan(&result.YearID, &result.EventID, &result.Industry ...) ```
  • 您的 JSON 是一个数组,但您将它解组为一个结构。看起来你有一部分结构被注释掉了,这将是解组到的正确类型。
  • 是的,我编辑的 II 将其更改为结构的切片。想我在下面弄明白了。与 MSSQL 如何在其网格中显示结果与如何在记录集中返回数据有关。谢谢!

标签: sql-server go


【解决方案1】:

我不确定为什么 FOR JSON 专门这样做,但选择 nvarchar(max) 列通常不是问题。

另一种解决问题的方法是先将其分配给变量:

DECLARE @j nvarchar(max) =
(
SELECT ...
FROM...
FOR JSON AUTO
);

SELECT @j;

【讨论】:

  • 这似乎也应该工作,因为它允许字符串为 2GB(对于我返回的数据来说绰绰有余)。谢谢!我会把你的答案作为正确答案。
【解决方案2】:

抱歉...找到了答案,与网格输出不同,MSSQL 将结果拆分为多个需要连接的行。

https://docs.microsoft.com/en-us/sql/relational-databases/json/format-query-results-as-json-with-for-json-sql-server?view=sql-server-ver15

FOR JSON 子句的输出 FOR JSON 子句的输出具有以下特点:

结果集包含一列。

一个小的结果集可能包含一行。 大型结果集将长 JSON 字符串拆分为多行。 默认情况下,当输出设置为“结果到网格”时,SQL Server Management Studio (SSMS) 会将结果连接到单行中。 SSMS 状态栏显示实际的行数。 其他客户端应用程序可能需要代码通过连接多行的内容将冗长的结果重新组合成一个有效的 JSON 字符串。有关 C# 应用程序中此代码的示例,请参阅在 C# 客户端应用程序中使用 FOR JSON 输出。

【讨论】:

    猜你喜欢
    • 2023-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-16
    • 1970-01-01
    • 2017-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多