问题
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