SQL Server T-SQL - import multiple JSON files in a loop

為{幸葍}努か 提交于 2021-02-04 08:12:05

问题


I am trying to use the following code snippet to iterate through a list of json files. I have excluded the iteration logic but essentially I will have to pass in a variable to openrowset function.

DECLARE @i INT = 1
DECLARE @json AS VARCHAR(MAX),
        @file AS NVARCHAR(MAX),
        @command AS VARCHAR(MAX)

WHILE(@i < 10)
BEGIN
    SET @file = 'C:\file\path';
    PRINT @file

    SELECT @json = BulkColumn 
    FROM OPENROWSET (BULK ''' + @file +''', SINGLE_CLOB) AS j

    SELECT * 
    FROM OPENJSON(@json) AS json
    -- Optionally, save the JSON text in a table.
    SET @i = @i + 1 ;
END

But the openrowset function keeps rejecting the @file variable with the following error:

Cannot bulk load. The file "' + @file +'" does not exist or you don't have file access rights.


回答1:


Your don't need to concatenate file name with " ' " Try this:

DECLARE @i INT = 1
DECLARE @json AS VARCHAR(MAX),
@file AS NVARCHAR(MAX),
@command AS VARCHAR(MAX)

WHILE(@i < 10)
BEGIN
  SET @file = N'C:\file\path';
  print @file
  SELECT @json = BulkColumn FROM OPENROWSET (BULK @file, SINGLE_CLOB) AS j

  SELECT * FROM OPENJSON(@json) AS json
  -- Optionally, save the JSON text in a table.
  SET @i = @i + 1 ;
END



回答2:


OPENROWSET (BULK ...) expects string constant as value for 'data_file' argument . If your JSON content is always in one file, use string constant as file name. If the JSON content is in different files, generate a dynamic statement:

Statement:

DECLARE @i INT = 1
DECLARE @json AS VARCHAR(MAX),
        @file AS NVARCHAR(MAX),
        @command AS VARCHAR(MAX)
DECLARE @stm nvarchar(max)

WHILE(@i < 10)
BEGIN
    -- 1. File name as string constant
    SELECT @json = BulkColumn 
    FROM OPENROWSET (BULK 'd:\test.json', SINGLE_CLOB) AS j

    -- 2. Dynamic statement. Generate different file names or use one file name
    --SET @file = 'd:\test' + CONVERT(varchar(1), @i) + '.json';
    SET @file = 'd:\test.json';
    SET @stm = N'
        SELECT @json = BulkColumn 
        FROM OPENROWSET (BULK ''' + @file + ''', SINGLE_CLOB) AS j
    '
    EXEC sp_executesql @stm, N'@json AS VARCHAR(MAX) OUTPUT', @json OUTPUT

    -- Read JSON data
    SELECT * 
    FROM OPENJSON(@json) AS json

    -- Optionally, save the JSON text in a table.
    SET @i = @i + 1;
END



回答3:


Figured this out:

DECLARE @i INT = 1
DECLARE @json AS NVARCHAR(MAX),
@file AS NVARCHAR(MAX),
@command AS NVARCHAR(MAX)

IF OBJECT_ID('tempdb..#t')IS NOT NULL
      DROP TABLE #t;
create table #t (jsonstr NVARCHAR(MAX))

WHILE(@i < 10)
BEGIN
  SET @file = N'C:\file\path';
  print @file
  SELECT @command= 'SELECT BulkColumn FROM OPENROWSET (BULK '''+ @file +''' , SINGLE_CLOB) AS j'    

    insert #t
    EXEC (@command) 
    set @json = (select * from #t)   
    SELECT * FROM OPENJSON(@json) AS json
    truncate TABLE #t; 
    SET @i = @i + 1 ;
END

Not sure if this is the most efficient way, but should work to loop thru a list of Json files and traverse/process the json data.



来源:https://stackoverflow.com/questions/57275552/sql-server-t-sql-import-multiple-json-files-in-a-loop

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!