简体   繁体   中英

Pass file by @parameter to OPENROWSET BULK json query, SQL 2016

In sql 2016 This works:

SELECT @JSONFileData = BulkColumn FROM OPENROWSET (BULK  
'C:\Temp\Students_2015.json', SINGLE_CLOB) as JSON

This does not:

SELECT @JSONFileData = BulkColumn FROM OPENROWSET (BULK  ' + @FullFile + ' , 
SINGLE_CLOB) as JSON

Message: Cannot bulk load. The file " + @FullFile + " does not exist.

@FullFile = 'C:\\Temp\\Students_2015.json'

I'm using an Execute SQL Task in a Foreach Loop Container, in a SSDT project that will pass in many files. How can I format my SQL query so I can pass files in by parameter?

Thanks,

Kevin

Here is my test:

DECLARE @Year varchar(4)
SET @Year = '2015'

DECLARE @Path varchar(50)
SET @Path= 'C:\Temp\'

DECLARE @File varchar(10)
SET @File= 'Students_'

DECLARE @FullFile varchar(50)
SET @FullFile= @Path+@File+@Year+'.json'

Declare @JSONFileData varchar(max)

SELECT @JSONFileData = BulkColumn FROM OPENROWSET (BULK  
'C:\Temp\Students_2015.json', SINGLE_CLOB) as JSON

SELECT @JSONFileData = BulkColumn FROM OPENROWSET (BULK  ' + @FullFile + ' , 
SINGLE_CLOB) as JSON

Dynamic SQL worked for me. Additionally, since I was parsing a JSON file I needed to add an additional set of '' around the '$.xxx' json elements to query the file successfully. Here is my working example:

DECLARE @FullFile varchar(50)
SET @FullFile = 'C:\Temp\Students_2016.json'

DECLARE @sqlUpdate varchar(max)

SET @sqlUpdate = 
'Declare @JSONFileData varchar(max)
SELECT @JSONFileData = BulkColumn FROM OPENROWSET (BULK N''' + @FullFile + ''', 
SINGLE_CLOB) as JSON

INSERT INTO Student_Stage (
FirstName
)
SELECT  
JSON_VALUE(sourceTable.value, ''$.FirstName'') AS [FirstName]
FROM OPENJSON(@JSONFileData, ''$.Items'') AS sourceTable'
EXEC (@sqlupdate)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM