【问题标题】:Read JSON into Local SQL Variable将 JSON 读入本地 SQL 变量
【发布时间】:2018-07-27 06:57:15
【问题描述】:

我想从 Azure Blob 存储读取大量 JSON 文件(大约 1000 个)并将它们插入到 Azure SQL 数据库 SQL 表中,按照 this tutorial 的行,但通过从文件中读取 JSON 而不是内联.需要明确的是:我希望每个文件都被读取为一个字符串,该字符串成为表中的单个 NVARCHAR(max) 条目。这似乎应该很简单,但我不知道该怎么做。

下面是我的代码,它在我注释的行中产生错误“'('附近的语法不正确”。每个 JSON 文件只是一个字典,都具有相同的键,沿线

{“D”:“0.980287579”,“B”:“0.679793971”,“C”:“0.217004033”,“A”:“0.675980258”}

IF OBJECT_ID(N'dbo.testJSON', N'U') IS NOT NULL
    DROP TABLE dbo.testJSON
GO

CREATE TABLE dbo.testJSON (
    rowID smallint NOT NULL PRIMARY KEY,
    jsonData nvarchar(max)
)
GO

ALTER TABLE dbo.testJSON
    ADD CONSTRAINT [Check for JSON] CHECK (ISJSON(jsonData)=1)
GO

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

WHILE @i < 1000
    BEGIN
        SET @file = 'JSONfile' + CAST(@i AS VARCHAR(5)) + '.json'
        -- Line below doesn't work
        SELECT @json = BulkColumn FROM OPENROWSET(BULK(@file), SINGLE_CLOB) AS j
        -- Line above doesn't work
        INSERT INTO dbo.testJSON (rowID, jsonData) VALUES (@i, @json)
        set @i = @i + 1
    END
GO

感谢大家的帮助!

【问题讨论】:

  • 您的文件在哪里?这有点重要。如果这是在 SQL Azure 中,那么您可以使用 CREATE EXTERNAL DATA SOURCE 来引用 Blob 存储。然后你可以使用BULK INSERT从blob存储中插入文件并将它们写入表。
  • 不要写“不起作用”。实际上解释发生了什么。监视器飞走了?植物从你的键盘上长出来了?
  • @Nick.McDermaid 已更新。是的,它是 Azure,但它不像 BULK INSERT 那样简单(我不这么认为)。我只想要一个包含 JSON 字符串的列。我什至找不到正确的语法来传递给OPENROWSET,但我已经指定了错误消息...
  • 感谢您为您的问题添加详细信息。 Blob 存储肯定不能访问 vai C 驱动器。过去,我曾将 blob 中的多行文件插入 SQL Azure。唯一的区别是您的文件只有一行。我想我之前已经在这里解释过 - 我会看看能不能找到它
  • 这是从 blob 存储argonsys.com/learn-microsoft-cloud/library/…将文件插入 SQL Azure 的基本指南

标签: sql json azure-sql-database


【解决方案1】:

我会将读者推荐给this 问题,它的措辞比我好。您必须使用动态 SQL 在 OPENROWSET 中插入变量。工作代码是:

IF OBJECT_ID(N'dbo.testJSON', N'U') IS NOT NULL
    DROP TABLE dbo.testJSON
GO

CREATE TABLE dbo.testJSON (
    rowID smallint NOT NULL PRIMARY KEY,
    jsonData nvarchar(max)
)
GO

ALTER TABLE dbo.testJSON
    ADD CONSTRAINT [Check for JSON] CHECK (ISJSON(jsonData)=1)
GO


DECLARE @i INT = 1
DECLARE @numObservations INT = 1000
DECLARE @json NVARCHAR(MAX)
DECLARE @file VARCHAR(4000)
DECLARE @sql VARCHAR(4000)

WHILE @i <= @numObservations
    BEGIN
        SET @file = 'testJSON' + CAST(@i AS VARCHAR(5)) + '.json'
        SET @sql = N'INSERT INTO dbo.testJSON (rowID, jsonData)
        SELECT ' + CAST(@i AS VARCHAR(5)) + ', * FROM OPENROWSET(BULK ''' + @file + ''', DATA_SOURCE = ''AzureBlobStorage'', SINGLE_CLOB) as x'
        EXEC(@sql)
        SET @i = @i + 1
    END
GO

【讨论】:

  • 我认为这里的重要部分是您如何设置 AzureBlobStorage 数据源 - 这背后有很多设置,并且肯定没有涉及 C 驱动器。
  • 这是一个不同的过程,并且是一个相当简单的设置(documentation,C: 驱动器只是因为我为了匿名而更改了事物的名称,所以忽略它(我在前面删除了它)编辑)。
猜你喜欢
  • 2018-06-12
  • 1970-01-01
  • 2015-01-19
  • 2013-06-30
  • 2011-03-04
  • 1970-01-01
  • 1970-01-01
  • 2013-01-07
相关资源
最近更新 更多