Не удалось вставить данные JSON в SQLSERVER, если имя столбца содержит APOSTROPHE (s) - PullRequest
2 голосов
/ 31 января 2020

Я пытаюсь загрузить данные в формате Json в SQL Сервер с помощью процедуры сохранения в хранилище с помощью PowerShell

Ниже приведен сбой JSON Data

{
    "id":"2aa7ce44-2ac1-4efb-a5df-6c34086744b7",
    "isReadOnly":false,
    "isOnDedicatedCapacity":false,
    "capacityMigrationStatus":"",
    "type":"Group",
    "state":"Active",
    "name":"Wes' Test Team",
    "dashboards":[],
    "reports":[],
    "datasets":[],
    "users":[]
},
{
    "id":"cb876bcc-285a-40d7-a120-f23e73baafe8",
    "isReadOnly":false,
    "isOnDedicatedCapacity":false,
    "capacityMigrationStatus":"",
    "type":"Group",
    "state":"Active",
    "name":"Kehat's Corner",
    "dashboards":[],
    "reports":[],
    "datasets":[],
    "users":[]
}

вставить данные, потому что имя столбца содержит '(APOSTROPHE), и скрипт не может загрузить данные.

Может кто-нибудь помочь мне, как преодолеть, если имя столбца имеет APOSTROPHE в данных.

Сценарий PowerShell

Connect-PowerBIServiceAccount 
$PBIGroupsFile = "C:\TEMP\PBIGroupsExpanded.json"
$ActiveGroupsURLExPersonal = '/admin/groups?$top=5000&' + '$filter=type ne' + " 'PersonalGroup'" + '&$expand=dashboards,reports,datasets,users'
Invoke-PowerBIRestMethod -Url $ActiveGroupsURLExPersonal -Method Get | Out-File $PBIGroupsFile

Хранимая процедура

ALTER PROCEDURE [dbo].[InsertInventoryDataFromAPI_Temp]
    @JSON NVARCHAR(MAX) 
AS
BEGIN

DECLARE @PARSSEDJSON NVARCHAR(MAX)= SUBSTRING(@JSON,CHARINDEX('"value":',@JSON)+8,LEN(@JSON)-CHARINDEX('"value":[',@JSON)-10)

select  ROW_NUMBER () OVER (ORDER BY id) AS RowNum,* INTO #FLJSON
FROM OPENJSON(REPLACE(REPLACE(@PARSSEDJSON, CHAR(13)+CHAR(10), ''),'''',''))
WITH(
    id nvarchar(max) '$.id',
    isReadOnly nvarchar(max) '$.isReadOnly',
    isOnDedicatedCapacity nvarchar(max) '$.isOnDedicatedCapacity',
    capacityId nvarchar(max) '$.capacityId',
    capacityMigrationStatus nvarchar(max) '$.capacityMigrationStatus',
    type nvarchar(max) '$.type',
    state nvarchar(max) '$.state',
    name nvarchar(max) '$.name',
    dashboards nvarchar(max) '$.dashboards' AS JSON,
    reports nvarchar(max) '$.reports' AS JSON,
    datasets nvarchar(max) '$.datasets' AS JSON,
    users nvarchar(max) '$.users' AS JSON
    ) 

--Load Workspace Info
    INSERT INTO dbo.Workspace_temp
    Select id, isReadOnly,isOnDedicatedCapacity,capacityId,capacityMigrationStatus,type,state,name from #FLJSON

Вызов хранимой процедуры с использованием PowerShell

$JSON = Get-Content "C:\TEMP\PBIGroupsExpanded.json"
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = "Server=$SQLServer;Database=$SQLDBName;Integrated Security=True;"
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand
$SqlCmd.CommandText = "EXEC [dbo].[InsertInventoryDataFromAPI_Temp] '$JSON'"
$SqlCmd.Connection = $SqlConnection
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
$SqlAdapter.SelectCommand = $SqlCmd
$SqlConnection.Open()
$SQLReturn=$SQLCmd.ExecuteNonQuery()
$SqlConnection.Close()

Ответы [ 2 ]

0 голосов
/ 31 января 2020

Ниже приведен пример параметризованного запроса. Я не включил здесь SqlDataAdapter, так как он не нужен для про c вызова.

$SqlCmd = New-Object System.Data.SqlClient.SqlCommand("[dbo].[InsertInventoryDataFromAPI_Temp]", $SqlConnection)
$SqlCmd.CommandType = [System.Data.CommandType]::StoredProcedure
$jsonParameter = $SqlCmd.Parameters.Add("@JSON", [System.Data.SqlDbType]::NVarChar, -1)
$jsonParameter.Value = $JSON
$SqlConnection.Open()
$SQLReturn=$SQLCmd.ExecuteNonQuery()
$SqlConnection.Close()
0 голосов
/ 31 января 2020

Как отметил @DanGuzman в комментариях, вам нужно использовать SQL параметры, чтобы избежать этой проблемы

$SqlCmd.CommandText = "EXEC [dbo].[InsertInventoryDataFromAPI_Temp] @JSON"
$SqlCmd.Parameters.AddWithValue("@JSON", $JSON)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...