首页 > 解决方案 > 从 Powershell 插入 SQL Server 数据库时,为什么我的(大)字符串会被截断?

问题描述

我正在尝试从 Powershell 脚本将一个大字符串(49,443 个字符)插入我的 SQL Server 数据库,但由于某种原因,它在 43,679 个字符后被切断。这是我的脚本:

$SqlServer = "MyServer";
$SqlCatalog = "MyDatabase";
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = "MyConnectionString"
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand

$LargeString = gc C:\SomeTextFile.txt -Raw

$SqlQuery = "INSERT INTO MyTable (LargStringColumn) VALUES ('" + $LargeString "')"

$SqlCmd.CommandText = $SqlQuery
$SqlCmd.Connection = $SqlConnection
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
$SqlAdapter.SelectCommand = $SqlCmd
$DataSet = New-Object System.Data.DataSet
$nRecs = $SqlAdapter.Fill($DataSet)

数据库列的类型为 varchar(max),可容纳 2GB 数据。我的研究表明,一个 powershell 字符串可以容纳大约相同数量的数据。而我实际尝试插入的数据只是其中的一小部分(97KB)。

如果我做

Write-Host $LargeString

我可以看到所有的数据。如果我使用 Out-File,也是如此。运行插入命令时,我以某种方式丢失了数据。数据确实出现在数据库中,它不是整个字符串。

为什么我的字符串插入数据库时​​总是被截断?

标签: sql-serverpowershell

解决方案


回答这个问题我感到很尴尬,但事实证明我的原始代码是正确的,我不需要参数化我的脚本(但非常感谢你的提示,Larnu!)。实际上,整个字符串被插入到数据库中。我将通过将字符串直接从 SSMS 复制并粘贴到记事本中来验证数据。然而,我不知道的是 SSMS 限制了返回结果的字符数。

当我将数据提取到我已经在处理的 MVC 应用程序中时,我能够验证一切是否正常工作。我猜数据的简单导出也可以!

还有,Piotr,你说的完全正确。我最终不得不做一个 $LargString.replace 以便我所有的个人引号 ' 都将替换为双引号 "。再次感谢大家的帮助!


推荐阅读