【问题标题】:Japanese Characters are not recognized when using Invoke-SqlCmd -Query使用 Invoke-SqlCmd -Query 时无法识别日文字符
【发布时间】:2021-04-19 20:55:08
【问题描述】:

我正在使用 Invoke-SqlCmd 将数据从 json 文件插入到 SQL Server 表中,并使用如下存储过程:

Invoke-SqlCmd -ServerInstance $servername -Database $database -Query "EXEC dbo.InsertDataFromJson @JSON='$json'

通过获取原始内容获得 json:

$json = Get-Content -Path "path\to.json" -Raw

$json # Content:
'{"Id": "2fe2353a-ddd7-479a-aa1a-9c2860680477", 
"RecordType": 20, 
"CreationTime": "2021-02-14T08:32:23Z", 
"Operation": "ViewDashboard", 
"UserKey": "10099", 
"Workload": "PowerBI", 
"UserId": "102273335@gmail.com", 
"ItemName": "テスト", 
"WorkSpaceName": "My Workspace", 
"DashboardName": "テスト", 
"ObjectId": "テスト" }'

所有包含字符串、电子邮件和日文字符的列都是 NVARCHAR(MAX)。

问题是我的 json 包含日文字符,它们显示为 ????在表中。

当我尝试直接使用 SSMS 插入样本时,它工作正常。

你知道如何解决这个问题吗?

谢谢

【问题讨论】:

  • 你有 json 文件中内容的例子吗?可能是编码错误。
  • json 文件的编码是“UCS-2 LE BOM”。但正如你所看到的,我从中提取内容 Get-Content 并且日文字符在那里。
  • 从你的帖子中我不知道 $json 变量的值。
  • 这里是一个例子:'{ "Id": "2fe2353a-ddd7-479a-aa1a-9c2860680477", "RecordType": 20, "CreationTime": "2021-02-14T08:32: 23Z”、“操作”:“ViewDashboard”、“UserKey”:“10099”、“工作负载”:“PowerBI”、“UserId”:“102273335@gmail.com”、“ItemName”:“テスト”、“WorkSpaceName” :“我的工作区”,“仪表板名称”:“テスト”,“ObjectId”:“テスト”}'
  • 您可以使用示例编辑您的帖子,并为您的表提供架构以反映其中的数据类型吗?特别是具有错误编码值的列。

标签: sql json powershell invoke-sqlcmd


【解决方案1】:

尝试将 -Encoding 标志设置为 Utf8。

{"test":"みんな"}
Get-Content -Path ".\test.json" -Encoding Utf8

【讨论】:

  • 我已经试过了。我认为问题在于 Invoke-SqlCmd,我没有其他方法可以在不使用 BULK 和 OpenRowset 的情况下将数据插入 Sql 表。
  • 好的,如果我运行这样的插入语句,我会得到相同的结果???我的表中的条目。插入到 Japanese_chars(文本)值('テスト')。但是,如果我这样定义数据类型,它会正确插入。插入到Japanese_chars(文本)值(N'テスト')我​​不知道如何使用json导入函数来定义它。
  • 是的。正如我所说,使用值中的日文字符运行 SQL 命令插入工作正常:我在 SSMS 中运行它并且它工作insert into dbo.PowerBIActivityEvent (ItemName, Activity) VALUES (N'ンプライ', N'test123') 问题是运行 Invoke-SqlCmd 以 json 作为变量和其内容中的日文字符..
【解决方案2】:

如果您遇到同样的问题,我刚刚找到了一个优雅的解决方案。 首先,我有一个带有参数的存储过程。提供帮助的网站是:https://community.idera.com/database-tools/powershell/ask_the_experts/f/sql_server__sharepoint-9/18939/examples-running-sql-stored-procedures-from-powershell-with-output-parameters

我没有使用 Invoke-SqlCmd(这是最糟糕的),而是使用 System.Data.SqlClient.SqlCommand 如下:

$connection.ConnectionString="Server={0};Database={1};Integrated Security=True" -f $servername, $database
$connection.Open()

在这里我使用集成安全性,因此我不需要输入我的信用。 “dbo.InsertDataFromJson”是我的存储过程。

$Command = new-Object System.Data.SqlClient.SqlCommand("dbo.InsertDataFromJson", $connection)
$json = Get-Content -Path .\sample.json -Raw
$Command.Parameters.Add("@JSON", [System.Data.SqlDbType]"NVARCHAR")
$Command.Parameters["@JSON"].Value = $json
$Command.ExecuteScalar()
$connection.Close()

然后瞧!我的日文字符在那里,一切都很好,我很高兴:)

【讨论】:

    猜你喜欢
    • 2012-09-13
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    • 2017-08-03
    • 2016-10-15
    • 1970-01-01
    • 2021-03-12
    • 1970-01-01
    相关资源
    最近更新 更多