【问题标题】:value can not be null error in PowerShellPowerShell中的值不能为空错误
【发布时间】:2022-01-14 14:49:43
【问题描述】:

我正在尝试使用这样的方法将我的 csv 文件导入我的 sql 数据库,但我不知道为什么会这样说

Exception calling "ExecuteWithResults" with "1" argument(s): "Value cannot be null.
Parameter name: sqlCommands"

即使我的 csv 文件中没有 Null 值,并且我也确保我的表列接受 null 值。


$s =  New-Object Microsoft.SqlServer.Management.Smo.Server "server name"
$db = $s.Databases.Item("LitHold")
$csvfile = import-csv -delimiter ";" -path "C:\scripts\LitHold-OneDrive\output\Return\2022-01-12-Return.csv"
$csvfile |foreach-object{
    $query = "insert into DailyReport VALUES ('$($_.MIN)','$($_.MID)','$($_.UPN)','$($_.Change)','$($_.Type)','$($_.HoldValue)','$($_.OneDrive)','$($_.Mailbox)','$($_.Created)','$($_.Modified)','$($_.MultMID)','$($_.Account)','$($_.ExistOD)')"
}

$result = $db.ExecuteWithResults($query)

# Show output
$result.Tables[0]

我的 csv 文件

//The top one is my columns name and it's already inside my table 
"MIN","MID","UPN","Change","Type","Hold Value","OneDrive","Mailbox","Created","Modified","Mult MID","Account","Exist OD"

"338780228","lzlcdg","lzlcdg@NAMQA.COM","Hold Created","OneDrive and Mailbox","Y","https://devf-my.sharepoint.com/personal/lzlcdg_namqa_corpqa_geuc_corp_com","lzlcdg@NAMQA.CORPQA.GEUC.CORP.COM","1/11/2022 11:38:57 AM","1/11/2022 11:38:57 AM","N","",""
"419150027","lzs8rl","lzs8rl@.corpq.com","Hold Created","OneDrive and Mailbox","Y","https://my.sharepoint.com/personal/lzs8rl_namqa_corpqa_gcom","lzs8rl@namqa.corpqa.geuc.corp.com","1/11/2022 11:39:05 AM","1/11/2022 11:39:05 AM","N","",""

【问题讨论】:

  • 根据您发布的 csv,您的分隔符是逗号,而不是分号。
  • 嗨@AbrahamZinala 感谢您指出这一点,我会准备好解决这个问题,但仍然遇到同样的错误。 :(
  • 单独运行:import-csv -path "C:\scripts\LitHold-OneDrive\output\Return\2022-01-12-Return.csv" 是否返回任何内容?
  • @AbrahamZinala 很奇怪,如果我只运行那个“import-csv:成员“LZ3J1G@CORPQA.GEUC.CORP.COM”已经存在,就会出现这个错误”
  • 除此之外...当调用ExecuteWithResults 时,您希望从insert 语句返回什么数据集?

标签: sql sql-server powershell csv powershell-2.0


【解决方案1】:

不要删除列标题,但要仔细检查它们是如何编写的。使用空格

你的代码忽略了这里的那些

$($_.HoldValue) --> $($_.'Hold Value')
$($_.MultMID) --> $($_.'Mult MID')
$($_.ExistOD) --> $($_.'Exist OD')

要么保留代码并重写标题(去掉空格),要么确保根据标题使用属性名称。

通过删除列标题,csv 文件中的第一行将用作列标题,除非您提供带有参数-Header 的新标题。如果多次遇到相同的字段值,删除标题将导致问题,因为列标题必须是唯一的

然后就是这一行:

$result = $db.ExecuteWithResults($csvfile)

应该是

$result = $db.ExecuteWithResults($query)

并且循环遍历 csv 文件的记录并在该循环内覆盖您的查询字符串在每次迭代中都没有意义,因此只会保留最后一条记录...

【讨论】:

  • 它工作,谢谢兄弟。真的很感激,但我能再问你一个问题吗?我的 csv 文件中有多个数据,但我不确定为什么它没有插入所有数据,它只插入最后一个数据。 ;((我上传了上面的数据)
  • @ziico 请看我回答的最后一行。您可能需要查找this
  • 我已经在我的实际代码中修复了这个问题,但它仍然只插入最后一个数据,而不是全部。 :(知道为什么会这样吗?
  • @ziico 请编辑您的问题并向我们展示您的修复。您是否也在该循环内执行查询?
  • 哦,好的,我现在明白了。我仍然忘记将结果放入 for 循环中。呵呵 非常感谢你的帮助。 :)
猜你喜欢
  • 2015-11-07
  • 1970-01-01
  • 2014-01-30
  • 2017-12-16
  • 1970-01-01
  • 2012-07-22
  • 1970-01-01
  • 2021-06-19
  • 2021-12-09
相关资源
最近更新 更多