You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server长JSON字符串完整导出与解析至新库的技术问询

解决SQL Server大JSON字段数据丢失与解析/导出问题

1. 将JSON列解析为键值对存入新数据库

直接在SQL Server端用内置JSON函数处理,避免客户端传输时的截断问题,效率更高:

步骤1:创建目标表

根据JSON结构创建新表,注意用NVARCHAR(MAX)存储可能的长值:

CREATE TABLE ParsedJsonTable (
    SourceId INT, -- 关联原表的主键
    JsonKey NVARCHAR(255),
    JsonValue NVARCHAR(MAX)
)

步骤2:解析并插入数据

如果是扁平JSON,用OPENJSON直接展开键值对:

INSERT INTO ParsedJsonTable (SourceId, JsonKey, JsonValue)
SELECT 
    ot.Id,
    j.[key],
    j.[value]
FROM OriginalTable ot
-- 确保原JSON列以MAX类型读取,避免截断
CROSS APPLY OPENJSON(CAST(ot.BigJsonCol AS NVARCHAR(MAX))) j

如果是嵌套JSON,用OPENJSON的WITH子句指定解析结构:

-- 假设目标表是结构化的,比如包含用户ID、姓名、邮箱等字段
CREATE TABLE StructuredData (
    SourceId INT,
    UserId INT,
    UserName NVARCHAR(100),
    Email NVARCHAR(200),
    Address NVARCHAR(MAX)
)

INSERT INTO StructuredData (SourceId, UserId, UserName, Email, Address)
SELECT 
    ot.Id,
    j.UserId,
    j.UserName,
    j.Email,
    j.Address
FROM OriginalTable ot
CROSS APPLY OPENJSON(CAST(ot.BigJsonCol AS NVARCHAR(MAX)))
WITH (
    UserId INT '$.user.id',
    UserName NVARCHAR(100) '$.user.name',
    Email NVARCHAR(200) '$.user.contact.email',
    Address NVARCHAR(MAX) '$.user.address.full'
) j

2. 完整提取数据至CSV文件

方法1:用SQL Server bcp命令(推荐,无客户端截断)

通过命令行直接从数据库导出,避免客户端工具的长度限制:

-- 导出包含大JSON字段的表到CSV
bcp "SELECT Id, CAST(BigJsonCol AS NVARCHAR(MAX)) AS BigJsonCol FROM YourDatabase.dbo.OriginalTable" queryout "C:\full_data.csv" -S YourServer -d YourDatabase -U YourUser -P YourPass -c -t, -r\n -w

参数说明:

  • -w:使用Unicode格式,支持长字符
  • -c:使用字符数据类型
  • -t,:指定逗号为分隔符
  • -r\n:指定换行符为行结束符

方法2:Python正确读取(解决截断问题)

使用pyodbc时必须添加MAX_VARCHAR_SIZE=0参数关闭长度限制:

import pyodbc
import csv

# 连接字符串关键:MAX_VARCHAR_SIZE=0 关闭字符截断
conn_str = (
    "DRIVER={ODBC Driver 17 for SQL Server};"
    "SERVER=YourServerName;"
    "DATABASE=YourDatabase;"
    "UID=YourUsername;"
    "PWD=YourPassword;"
    "MAX_VARCHAR_SIZE=0"
)

with pyodbc.connect(conn_str) as conn:
    cursor = conn.cursor()
    cursor.execute("SELECT Id, BigJsonCol FROM OriginalTable")
    rows = cursor.fetchall()

    # 写入CSV,用utf-8编码避免乱码
    with open('full_data.csv', 'w', newline='', encoding='utf-8') as f:
        writer = csv.writer(f)
        writer.writerow(['Id', 'BigJsonCol'])
        for row in rows:
            writer.writerow([row[0], row[1]])

如果用pandas:

import pandas as pd
import pyodbc

conn_str = (
    "DRIVER={ODBC Driver 17 for SQL Server};"
    "SERVER=YourServerName;"
    "DATABASE=YourDatabase;"
    "UID=YourUsername;"
    "PWD=YourPassword;"
    "MAX_VARCHAR_SIZE=0"
)

with pyodbc.connect(conn_str) as conn:
    df = pd.read_sql("SELECT Id, BigJsonCol FROM OriginalTable", conn)
    df.to_csv('full_data.csv', index=False, encoding='utf-8')

关于VSCode导出的补充

VSCode的SQL扩展默认限制了返回字符长度,可以在设置中搜索对应扩展的maxResultLength,设为0(不限制)或更大数值,但上述数据库端/命令行/Python方法更稳定可靠。

内容的提问来源于stack exchange,提问作者frank

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 15:47:39