我想将一些带有PowerShell的AD属性插入到SQL表中。到目前为止一切顺利:
$insert = @'
INSERT INTO [mdb].[dbo].[import](id,userid)
VALUES ('{0}','{1}')
'@
Try {
$connectionString = 'Data Source=serverdb;Initial Catalog=mdb;Integrated Security=SSPI'
$conn = New-Object System.Data.SqlClient.SqlConnection($connectionString)
$conn.Open()
$cmd = $conn.CreateCommand()
$counter = 0
Get-ADUser -Filter * -SearchBase "OU=company,DC=company,DC=state,DC=de" | Select @{Name="ID";Expression={ $global:counter; $global:counter++ }},SamAccountName |`
ForEach-Object {
$cmd.CommandText = $insert -f $counter,$_.SamAccountName
$cmd.ExecuteNonQuery()
}
$conn.Close()
}
Catch {
Throw $_
}get-ADUser的输出是正确的,但是insert抛出了一个错误,即主键有重复的错误。递增一定是错误的。
有人能帮上忙吗?谢谢!
发布于 2020-11-05 18:47:08
ID是从1开始的,不是0,这正常吗?
此外,为什么要创建一个用户定义的属性(ID)而不使用它?
你也可以避免丑陋的全局作用域(这里从0开始计数):
#### $counter = 0 <--- No more usefull
Get-ADUser -Filter * -SearchBase "OU=company,DC=company,DC=state,DC=de" | Select SamAccountName |`
ForEach-Object -Begin { $counter = 0 } -Process {
$cmd.CommandText = $insert -f $counter,$_.SamAccountName
$cmd.ExecuteNonQuery()
$counter++
}我不是SQL专家,所以这可能不是一个专家。但是,您在这里有更好的代码;)
发布于 2020-11-05 21:05:02
在使用SQL插入数据时,应该始终使用参数。(Why?)简而言之:它更安全,性能更好,更健壮,更容易使用。
将操作(++$counter)放在圆括号中,以便在递增后返回值。(如果您想要从0开始的if,请使用$counter++;如果您想要从1开始的if,请使用++$counter。)
$cmd.CommandText = "
INSERT INTO [mdb].[dbo].[import](id,userid)
VALUES (@id, @userId)
"
$counter = 0
Get-ADUser -Filter * -SearchBase "OU=company,DC=company,DC=state,DC=de" | foreach {
$cmd.Parameters.Clear()
$cmd.Parameters.AddWithValue("id", (++$counter))
$cmd.Parameters.AddWithValue("userId", $_.SamAccountName)
$cmd.ExecuteNonQuery()
}https://stackoverflow.com/questions/64694910
复制相似问题