将 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 如果ContentNVARCHAR(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)... 除了事实上,使用 BULKT-SQL 访问文件会变得非常难看,你将不得不使用 some more parameters 之类的CODEPAGE 得到正确的结果...

以上是关于将 JSON 文件读入表中的主要内容,如果未能解决你的问题,请参考以下文章

如何从 JSON 文件读入 JavaScript? [复制]

将 json 文件读入 Spark DataFrame

带有 JSON 格式字符串的文件,如何将文件内容读入 NSDictionary

将 json 文件读入 CoreData 时出现精度错误

使用 pyspark 将 json 文件读入 RDD(不是 dataFrame)

将大型 JSON 文件读入 C#.net 中的变量