Sql server SQL Server:插入14000+;带Powershell的行
我编写了一个SQL查询,将一些服务器属性插入数据库。问题是,我现在正在处理14000多台服务器,INSERT命令似乎有1000行的限制。我希望尽可能少地与数据库联系,无意中发现了Sql server SQL Server:插入14000+;带Powershell的行,sql-server,powershell,Sql Server,Powershell,我编写了一个SQL查询,将一些服务器属性插入数据库。问题是,我现在正在处理14000多台服务器,INSERT命令似乎有1000行的限制。我希望尽可能少地与数据库联系,无意中发现了编写SqlTableData,但我遇到了一个错误: Write-SqlTableData -DatabaseName $SQLDatabaseName -SchemaName dbo -TableName all.computer -Credential $DatabaseUser
编写SqlTableData
,但我遇到了一个错误:
Write-SqlTableData -DatabaseName $SQLDatabaseName -SchemaName dbo
-TableName all.computer -Credential $DatabaseUserCredential
-InputData $sqlValues -ServerInstance "$SQLServerName\MSSQLSERVER"
写入SqlTableData:无法连接到服务器sqlsrv01.domain.local\MSSQLSERVER
代码片段如下所示:
#$allComputers = ...retrieved from API
$SqlServerName = 'sqlsrv01.domain.local'
$DatabaseUserCredential = Get-Credential
$sqlValues = New-Object Collections.ArrayList
$allComputers.computers | ForEach-Object {
$_ | ForEach-Object {
$_.PsObject.Properties | ForEach-Object {
If ($_.Value -match "'") {
$_.Value = $_.Value.Replace("'", "''")
}
}
}
$sqlValues.Add("('$($_.aa)', '$($_.phone_number)', '$($_.manual_scan_time)', '$($_.ip_addr)', '$($_.last_logon_user_guid)', '$($_.urlfilter_violated)', '$($_.last_connect_time)', '$($_.id)', '$($_.spyware_detected)', '$($_.arch)', '$($_.sched_start_time)', '$($_.virus_detected)', '$($_.platform)', '$($_.version)', '$($_.manual_aggressive_complete_time)', '$($_.online)', '$($_.type)', '$($_.status)', '$($_.spam_detected)', '$($_.sched_complete_time)', '$($_.sched_scan_time)', '$($_.pop3_scan)', '$($_.manual_aggressive_start_time)', '$($_.last_logon_user_account)', '$($_.name)', '$($_.ss_service)', '$($_.scan_mode)', '$($_.manual_complete_time)', '$($_.mac_addr)', '$($_.components)', '$($_.manual_start_time)', '$($_.last_logon_user_domain)', '$($_.created_at)', '$($_.last_connect_time_human)', '$($_.CustomerName)', '$(Get-Date)')")
}
$SQLQuery = ("USE $SQLDatabaseName`r`n INSERT INTO [dbo].[all.computer] (aa, phone_number, manual_scan_time, ip_addr, last_logon_user_guid, urlfilter_violated, last_connect_time, id, spyware_detected, arch, sched_start_time, virus_detected, platform, version, manual_aggressive_complete_time, online, type, status, spam_detected, sched_complete_time, sched_scan_time, pop3_scan, manual_aggressive_start_time, last_logon_user_account, name, ss_service, scan_mode, manual_complete_time, mac_addr, components, manual_start_time, last_logon_user_domain, created_at, last_connect_time_human, CustomerName, QueryDate)`r`nValues {0}" -f ($sqlValues -join "`r`n,"))
Invoke-Sqlcmd -Query $SQLQuery -ServerInstance $SQLServerName -Credential $DatabaseUserCredential -ErrorAction Stop
$allComputers对象是如下所示的对象数组:
aa : True
phone_number :
manual_scan_time : 0
ip_addr : 10.50.0.147
last_logon_user_guid : 286c1410eb470e4ea31dd17e9c1eee31
urlfilter_violated : 0
last_connect_time : 1563379779
id : 0542c82cada09040be79bfb6e54fd119
spyware_detected : 0
arch : x64
sched_start_time : 1562922019
virus_detected : 0
platform : Win Server 2012 R2
version : 6.6.2457/14.1.1516
manual_aggressive_complete_time : 0
online : True
type : 1
status : 1
spam_detected : 0
sched_complete_time : 1562926028
sched_scan_time : 1559294629
pop3_scan : False
manual_aggressive_start_time : 0
last_logon_user_account : jdoe
name : server01
ss_service : True
scan_mode : 0
manual_complete_time : 0
mac_addr : 2B:41:38:B4:34:46
components : {@{version=0; type=1}, @{version=11.000.1006; type=3}, @{version=15.239.00; type=14}}
manual_start_time : 0
last_logon_user_domain : acme
created_at : 1510519578
last_connect_time_human : 7/17/2019 4:09:39 PM
CustomerName : Acme Corp
问题是:
Write-SqlTableData
似乎需要实例名,但当我使用Invoke-Sqlcmd
时,如果没有实例名,我的连接很好for($i=0; $i -lt $sqlValues.Count; $i+=1000){
Write-Host "Loop: $i"
$SQLQuery = ("USE $SQLDatabaseName`r`n INSERT INTO [dbo].[all.computer] (aa, phone_number, manual_scan_time, ip_addr, last_logon_user_guid, urlfilter_violated, last_connect_time, id, spyware_detected, arch, sched_start_time, virus_detected, platform, version, manual_aggressive_complete_time, online, type, status, spam_detected, sched_complete_time, sched_scan_time, pop3_scan, manual_aggressive_start_time, last_logon_user_account, name, ss_service, scan_mode, manual_complete_time, mac_addr, components, manual_start_time, last_logon_user_domain, created_at, last_connect_time_human, CustomerName, QueryDate)`r`nValues {0}" -f ($sqlValues[$i..($i+999)] -join "`r`n,"))
Invoke-Sqlcmd -Query $SQLQuery -ServerInstance $SQLServerName -Credential $DatabaseUserCredential -ErrorAction Stop
}
其中魔术是选择1000行批次,包括:
$sqlValues[$i..($i+999)]
PowerShell是解决此类问题的好工具。更适合此类任务的另一种方法是使用SQL Server Integration Services(SSI),该服务旨在接收大量不同的数据(包括API)并将其“提取转换负载”(ETL)到高性能的数据库中。1000限制可以减轻:所以,我每次都必须重新创建表?