Sql 将JSON文件读入表中
我正在尝试从某个位置读取JSON文件并写入SQL server表。位置中的文件每天都在变化,因此我可能需要找到一种动态方式来选择文件名 我曾尝试使用Sql 将JSON文件读入表中,sql,json,sql-server,tsql,ssis,Sql,Json,Sql Server,Tsql,Ssis,我正在尝试从某个位置读取JSON文件并写入SQL server表。位置中的文件每天都在变化,因此我可能需要找到一种动态方式来选择文件名 我曾尝试使用OPENROWSET,但是我读到我无法用它参数化位置名称。我试图将OPENROWSET与动态查询一起使用,但出现了一个错误,无法找到文件位置。在阅读了相关内容后,似乎这可能是一个文件夹权限问题 我没有尝试并希望得到帮助的是如何读取JSON文本文件并将数据写入表中,然后从中使用OPENJSON函数 有谁能帮助我如何使用T-SQL或SSIS以某种blob
OPENROWSET
,但是我读到我无法用它参数化位置名称。我试图将OPENROWSET
与动态查询一起使用,但出现了一个错误,无法找到文件位置。在阅读了相关内容后,似乎这可能是一个文件夹权限问题
我没有尝试并希望得到帮助的是如何读取JSON文本文件并将数据写入表中,然后从中使用OPENJSON
函数
有谁能帮助我如何使用T-SQL或SSIS以某种blob形式加载SQL server中的JSON数据。因此,如果我理解正确,您的问题不是如何读取JSON,而是如何获取文件 正如您所发现的,在SQLServer之外与文件系统的任何交互(
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(某物)
- 您可以选择任何编程语言
- SSIS
- 还有更多
- 尽可能保持暂存表的开放性、通用性和容错性
- 在暂存表和目标表之间执行任何完整性检查、转换和处理事务安全
- 如果我理解正确,您的问题不是如何读取JSON,而是如何获取文件
正如您所发现的,在SQLServer之外与文件系统的任何交互(
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(某物)
- 您可以选择任何编程语言
- SSIS
- 还有更多
- 尽可能保持暂存表的开放性、通用性和容错性
- 在暂存表和目标表之间执行任何完整性检查、转换和处理事务安全
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;
确保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;
--从文件大容量导入数据
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
--如果=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]
--从文件大容量导入数据
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
--如果=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]
对的我一直在网上查看如何将数据存储到表中,而这正是我一直在努力的地方。我仅限于使用SSI和TSQL。我喜欢舞台的想法。我将其与SSIS导入列结合使用,但我的内容列(使用您的列名)会输出一些十六进制字符。如果
内容是NVARCHAR(MAX)
您可以直接将字符串文件读入其中。确保正确处理编码(utf-8、utf-16和更多)。如果您看到十六进制代码(并且您将Content
定义为VARBINARY(MAX)
),您可以尝试将其转换为VARCHAR(MAX)
或NVARCHAR(MAX)
。但这是危险的。SQL Server的编码非常有限。。。从v2014 SP2开始,utf-8导入具有BULK
…正确。我一直在网上查看如何将数据存储到表中,而这正是我一直在努力的地方。我仅限于使用SSI和TSQL。我喜欢舞台的想法。我将其与SSIS导入列结合使用,但我的内容列(使用您的列名)会输出一些十六进制字符。如果内容是NVARCHAR(MAX)
您可以直接将字符串文件读入其中。确保正确处理编码(utf-8、utf-16和更多)。如果您看到十六进制代码(并且您将Content
定义为VARBINARY(MAX)
),您可以尝试将其转换为VARCHAR(MAX)
或NVARCHAR(MAX)
。但这是危险的。SQL Server的编码非常有限。。。从v2014 SP2开始,utf-8导入具有BULK
…您真的应该将JSON读入NVARCHAR(MAX)
。。。除此之外,使用BULK