Sql 将JSON文件读入表中

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

我正在尝试从某个位置读取JSON文件并写入SQL server表。位置中的文件每天都在变化,因此我可能需要找到一种动态方式来选择文件名

我曾尝试使用
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
  • 还有更多
您可以轻松地使用外部计划作业检查文件并将其转移到临时表中,然后使用内部作业(在SQL Server中)检查未处理的文件并将其读取到目标表中

在这种情况下,一如既往:

  • 尽可能保持暂存表的开放性、通用性和容错性
  • 在暂存表和目标表之间执行任何完整性检查、转换和处理事务安全

    • 如果我理解正确,您的问题不是如何读取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
      • 还有更多
      您可以轻松地使用外部计划作业检查文件并将其转移到临时表中,然后使用内部作业(在SQL Server中)检查未处理的文件并将其读取到目标表中

      在这种情况下,一如既往:

      • 尽可能保持暂存表的开放性、通用性和容错性
      • 在暂存表和目标表之间执行任何完整性检查、转换和处理事务安全

      确保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;
      

      确保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