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
相关产品推荐
相关产品推荐

