sql-server – PowerShell中对Invoke-Sqlcmd的Unicode支持
Power
Shell
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 Invoke-Sqlcmd的MSDN documentation仅在传递时提及Unicode,将其命令行开关与sqlcmd的命令行开关进行比较,显示虽然后者具有输出Unicode的-u选项(在我上面的实验中甚至不需要),但是调用 – Sqlcmd没有等效参数. 通过广泛的网络搜索我没有发现任何关于这一点,但我仍然希望这在某种程度上是我的用户错误.在PowerShell中使用Invoke-Sqlcmd检索输入数据时,有没有办法保留输入数据? 解决方法更新我在另一台机器上测试了invoke-sqlcmd并且它可以工作,所以其余的可能不适用…更新2在执行通过-Query参数时,似乎只有-inputfile问题invoke-sqlcmd工作正常. 据我所知,这与转换字符串时ADO.NET DataTable有关.使用ExecuteScaler或ExecuteReader时,它可以正常工作.当然这不会修复invoke-sqlcmd,但确实解释了原因: $server = "$env:computernamesql1" $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 如果我使用UTF-8保存.sql文件,则使用-inputfile参数可以正常工作.在SSMS中保存.sql文件时可以选择UTF-8,但这里有一些Powershell代码来检查和更改编码.您需要从http://poshcode.org/2075获取Get-FileEncoding.ps1 . .Get-FileEncoding.ps1 Get-FileEncoding -Path E:binunicode.sql $query = get-content E:binunicode.sql $query= $query -join "`n" $query | Out-File -FilePath e:binunicode.sql -Encoding UTF8 -force Get-FileEncoding -Path E:binunicode.sql (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |