gpt4 book ai didi

sql-server - PowerShell 中 Invoke-Sqlcmd 的 Unicode 支持

转载 作者:行者123 更新时间:2023-12-02 10:06:54 25 4
gpt4 key购买 nike

PowerShell sqlps module为从 PowerShell 及其内部访问 SQL Server 提供核心支持 Invoke-Sqlcmd cmdlet 是执行文字查询或 SQL 脚本文件的主要工具(类似于非 PowerShell sqlcmd 实用程序)。我最近尝试了一些实验来确认 Invoke-Sqlcmd 可以处理 Unicode,并得到了一些令人惊讶的结果。

我从这个简单的脚本文件(名为 unicode.sql)开始:

CREATE TABLE #customers

( [IdCust] int,
[FirstName] nvarchar(25),
[SurName] nvarchar(25)
);
INSERT INTO #customers VALUES (4, N'Hans', N'Grüßner')
SELECT * FROM #customers;
DROP TABLE #customers;

请注意,姓氏具有一些可能在德国名字中找到的典型 Unicode 字符。

<小时/>

结果

SQL Server Management Studio:输出到网格或文本时正确呈现,例如

IdCust      FirstName                 Surname
----------- ------------------------- -------------------------
4 Hans Grüßner

sqlcmd 实用程序:无论是从 DOS shell 还是 PowerShell 运行,都可以正确呈现

C:\> sqlcmd -S .\SQLEXPRESS -i unicode.sql

IdCust FirstName Surname
----------- ------------------------- -------------------------
4 Hans Grüßner

PowerShell Invoke-Sqlcmd:渲染不正确(无论是输出为如下所示的文本还是通过管道传输到 Out-Gridview):

PS> Invoke-Sqlcmd -Server .\sqlexpress -InputFile unicode.sql

IdCust FirstName Surname
------ --------- -------
4 Hans Gr??ner

MSDN documentation Invoke-Sqlcmd 仅顺便提及 Unicode,将其命令行开关与 sqlcmd 的命令行开关进行比较,显示后者具有用于输出 Unicode 的 -u 选项(在我的实验中甚至不需要该选项)上面),Invoke-Sqlcmd 没有等效参数。

通过广泛的网络搜索,我没有发现任何关于这一点的信息,但我仍然希望这在某种程度上是我的用户错误。在 PowerShell 中使用 Invoke-Sqlcmd 检索输入数据时,有没有办法保留输入数据?

最佳答案

更新我在另一台机器上测试了invoke-sqlcmd并且它可以工作,所以也许其余的内容不适用...

更新 2 仅当通过 -Query 参数 invoke-sqlcmd 执行时,-inputfile 似乎存在问题,工作正常。

据我所知,这与转换字符串时的 ADO.NET DataTable 有关。当您使用 ExecuteScaler 或 ExecuteReader 时,它可以正常工作。当然,这并不能修复 invoke-sqlcmd,但确实解释了原因:

$server = "$env:computername\sql1"
$database = "tempdb"
$query = @"
CREATE TABLE #customers

( [SurName] nvarchar(25)
);
INSERT INTO #customers VALUES (N'Grüßner')
SELECT * FROM #customers;
"@


$connection=new-object System.Data.SqlClient.SQLConnection
$connection.ConnectionString="Server={0};Database={1};Integrated Security=True" -f $server,$database
$command=new-object system.Data.SqlClient.SqlCommand($query,$connection)
$connection.Open()
$command.ExecuteScalar()
$connection.Close()

更新3文件的编码似乎是关键。查看 [System.IO.File]::ReadAllText,MSDN 文档声明它只会检测 UTF-8 或 UTF-32 编码。 http://msdn.microsoft.com/en-us/library/ms143369(v=vs.90).aspx

如果我使用 UTF-8 保存 .sql 文件,则可以使用 -inputfile 参数。在 SSMS 中保存 .sql 文件时,您可以选择 UTF-8,但这里还有一些 Powershell 代码来检查和更改编码。您需要从 http://poshcode.org/2075 获取 Get-FileEncoding.ps1

. .\Get-FileEncoding.ps1 
Get-FileEncoding -Path E:\bin\unicode.sql

$query = get-content E:\bin\unicode.sql
$query= $query -join "`n"
$query | Out-File -FilePath e:\bin\unicode.sql -Encoding UTF8 -force

Get-FileEncoding -Path E:\bin\unicode.sql

关于sql-server - PowerShell 中 Invoke-Sqlcmd 的 Unicode 支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11905649/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com