将 JSON 文件读入表中
Posted
技术标签:
【中文标题】将 JSON 文件读入表中【英文标题】:Reading JSON file into a table 【发布时间】:2019-10-10 09:11:17 【问题描述】:我正在尝试从某个位置读取 JSON 文件并写入 SQL Server 表。该位置的文件每天都在变化,因此我可能需要找到一种动态的方式来选择文件名。
我尝试使用OPENROWSET
,但是我读到我无法使用它来参数化位置名称。我尝试将OPENROWSET
与动态查询一起使用,但我收到一个错误,即找不到文件位置。阅读后似乎可能是文件夹权限问题。
我没有尝试并希望获得帮助的是如何读取 JSON 文本文件并将数据写入表中,然后我可以从那里使用 OPENJSON
函数。
谁能帮助我了解如何使用 T-SQL 或 SSIS 在某种 blob 中加载带有 JSON 数据的 SQL 服务器。
【问题讨论】:
查看以下链接:***.com/questions/56534451/… 【参考方案1】:--从文件批量导入数据
Select BulkColumn from openrowset(Bulk'D:\home\HS\HS-Web\wwwroot\Json files\test.json',single_blob)JSON;
--查看从批量导入中导入的数据作为单列
DECLARE @TestDetails VARCHAR(MAX)
SELECT @TestDetails = BulkColumn FROM
OPENROWSET(BULK'D:\Omkar\Projects\HS\Documents\test.json', SINGLE_BLOB) JSON;
SELECT @TestDetails as SingleRow_Column
--检查导入的数据是否为有效数据 if=1 数据有效
if(ISJSON(@TestDetails)=1)
BEGIN
PRINT 'Valid Data Imported'
END
ELSE
BEGIN
PRINT 'Invalid Data Imported'
END
GO
--现在选择要添加到表中的数据 $.tests 是数组对象名称
SELECT testCode,Test,Method FROM OPENJSON(@TestDetails, '$.Tests')
WITH(
testCode nvarchar(50)'$.testCode',
Test nvarchar(50)'$.Test',
Method nvarchar(50)'$.Method'
)
--如果需要插入默认值,则现在将数据插入表中,然后在选择中取默认值
Insert into TestDetails(Active,CreatedDate,testCode,Test,Method)
SELECT '1','2019-10-23 06:01:10.7927233',testCode,Test,Method FROM
OPENJSON(@TestDetails, '$.Tests')
WITH(
testCode nvarchar(50)'$.testCode',
Test nvarchar(50)'$.Test',
Method nvarchar(50)'$.Method'
)[Json file Screen Shot][1]
【讨论】:
【参考方案2】:如果我理解正确,您的问题不在于如何读取 JSON,而是如何获取文件?
正如您所发现的,与 SQL-Server (T-SQL
) 之外的文件系统的任何交互都会变得非常棘手。 SQL-Server 仅限于它自己的用户,并且会看到它自己的机器。所以C:\
上的路径可能不是您所期望的。
但是,在摆弄权限、充当身份验证和共享路径的 kerberos 之前,我建议创建一个临时表,例如:
CREATE TABLE dbo.JSONImport_staging
(ID INT IDENTITY CONSTRAINT PK_JSONImport_staging PRIMARY KEY
,ImportDate DATETIME2 NOT NULL CONSTRAINT DF_JSONImport_staging_ImportDate DEFAULT(SYSUTCDATETIME())
,FileLocation NVARCHAR(1000) NULL
,Content NVARCHAR(MAX) NULL
,ProcessedOn DATETIME2 NULL
,Success BIT NULL);
并使用您在网上找到的众多方法中的一种将数据存储在这样的表中
PowerShell(along this) 您选择的任何编程语言 SSIS 还有更多您可以轻松地使用外部调度作业检查文件并将它们转移到临时表中,然后使用内部作业(在 SQL-Server 内)检查未处理的文件并将它们读入目标表。
在这种情况下总是这样:
尽可能保持临时表的开放性、通用性和容错性。 在暂存表和目标表之间进行任何完整性检查、转换和处理事务安全。【讨论】:
正确。一直在网上检查如何将数据存储到我一直在努力的表中。我仅限于使用 SSIS 和 TSQL。我喜欢临时表的想法。我将它与 SSIS 导入列结合使用,但我的内容列(使用您的列名)显示了一些 HEX 字符。不是我所期望的。 @BRILLIANT 如果Content
是NVARCHAR(MAX)
,您可以直接将字符串文件读入其中。确保您正确处理编码(utf-8、utf-16 等)。如果您看到 HEX 代码(并且您将 Content
定义为 VARBINARY(MAX)
),您可以尝试将其转换为 VARCHAR(MAX)
或 NVARCHAR(MAX)
。但这很危险。 SQL-Server 的编码非常受限制......从 v2014 SP2 开始,有 BULK
的 utf-8 导入......【参考方案3】:
确保文件可以被 SQL 访问
IF OBJECT_ID('tempdb..#JsonFile') IS NOT NULL
DROP TABLE #JsonFile;
CREATE TABLE #JsonFile
(
[JsonLine] NVARCHAR(MAX)
);
BULK INSERT #JsonFile
FROM '\\UNC_path\file.json'
WITH ( ROWTERMINATOR = '' );
SELECT *
FROM #JsonFile;
【讨论】:
你真的应该将 JSON 读入NVARCHAR(MAX)
... 除了事实上,使用 BULK
从 T-SQL
访问文件会变得非常难看,你将不得不使用 some more parameters 之类的CODEPAGE
得到正确的结果...以上是关于将 JSON 文件读入表中的主要内容,如果未能解决你的问题,请参考以下文章
如何从 JSON 文件读入 JavaScript? [复制]
带有 JSON 格式字符串的文件,如何将文件内容读入 NSDictionary