【问题标题】:Fetch stored procedure result as JSON以 JSON 格式获取存储过程结果
【发布时间】:2021-02-27 17:37:21
【问题描述】:

我的代码:

cursor = conn.cursor()
cursor.execute("EXEC prcFetch")  # Fetching Json data from database via stored procedure
res = cursor.fetchall()
conn.close()
print(res)                      # type(res) is list

存储过程:

GO
CREATE PROCEDURE prcFetch AS
BEGIN
    SELECT * 
    FROM JsonData 
    FOR JSON PATH
END

输出:

[('[{"Name":"abc","Age":"25","Gender":"M"}]',)]

我尝试反序列化上述输出。

print(json.loads(res))

错误:

TypeError:JSON 对象必须是 str、bytes 或 bytearray,而不是 list

【问题讨论】:

    标签: python json sql-server pyodbc


    【解决方案1】:

    @Martijn Pieters 的回答正确,但 SQL Server 将FOR JSON 的结果拆分为多行if it is more than 8000 bytes。要将所有行作为 JSON 在一行中,请在您的存储过程中尝试以下操作:

        CREATE PROCEDURE prcFetch AS
        BEGIN
         
         DECLARE @result NVARCHAR(max) = (SELECT * FROM JsonData FOR JSON AUTO);
            
         SELECT @result;
    
        END
    

    【讨论】:

      【解决方案2】:

      您使用cursor.fetchall()获取了所有

      res = cursor.fetchall()
      

      对于存储过程,这只是一行,一列。结果是一个包含一个元素的行列表,一个元素是一个带有单列的元组,带有您的 JSON。

      不要使用cursor.fetchall(),使用cursor.fetchval(),它返回第一行的第一列:

      json_data = cursor.fetchval()
      

      cursor.fetchval() 特定于 pyodbc 库,而不是 Python DB-API 2.0 specification 的一部分。如果您使用其他库,请改用cursor.fetchone(),并使用索引(json_data = cursor.fetchone()[0])或元组赋值(json_data, = cursor.fetchone())。

      【讨论】:

      • cursor.fetchval() 或 cursor.fetchone()[0] 不起作用。我没有得到整个列表。
      • @user15069057:定义“不工作”。您的问题表明存储过程返回了 JSON strirg '[{"Name":"abc","Age":"25","Gender":"M"}]',如果您期望更多,则需要修复您的存储过程。那将是另一个问题的主题。
      • SELECT * FROM JsonData FOR JSON PATH 在 SQL SERVER 中返回整个列表
      • @user15069057:可能是这样,但我不知道 SQL Server 存储过程如何与多行结果交互。在这种情况下,您可能只能访问第一行。我们解决了您的 Python 问题,请就您的 SQL Server SP 问题提出一个问题。
      • @user15069057:另外,大概您不想想要单独的行,而是想要一个包含所有行的 JSON 文档
      猜你喜欢
      • 2017-08-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-04
      • 2014-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多