dev-owl
Goto Top

Powershell - CSV Import in SQL

Guten Abend,

ich habe für den Upload einer CSV in SQL folgendes Skript:

$CSVFileName = "C:\Users\User-01\Desktop\ImportingCSVsIntoSQLv1\ExampleData.csv"  
$SQLInstance = "localhost\SQLEXPRESS"  
$SQLDatabase = "CSVDemoDB01"  
$SQLTable = "CSVData"  
$SQLTempDatabase = "tempdb"  
$SQLTempTable = "CSVDataImport"  

$SQLCredentials = Get-Credential -Message "Enter your SQL username & password"  
$SQLUsername = $SQLCredentials.UserName
$SQLPassword = $SQLCredentials.GetNetworkCredential().Password

$Start = Get-Date

$SQLModuleCheck = Get-Module -ListAvailable SqlServer
if ($SQLModuleCheck -eq $null)
{
write-host "SqlServer Module Not Found - Installing"  

Set-PSRepository -Name PSGallery -InstallationPolicy Trusted

Install-Module -Name SqlServer –Scope CurrentUser -Confirm:$false -AllowClobber
}

Import-Module SqlServer

$SQLCreateTempTable = "USE $SQLTempDatabase  
    CREATE TABLE $SQLTempTable (
    RowID int IDENTITY(1,1) PRIMARY KEY,
	RecordID varchar(50),
    DataField1 varchar(255),
	DataField2 varchar(255)
);"  
Invoke-SQLCmd -Query $SQLCreateTempTable -ServerInstance $SQLInstance -Username $SQLUsername -Password $SQLPassword

$CSVImport = Import-CSV $CSVFileName
$CSVRowCount = $CSVImport.Count

"Inserting $CSVRowCount rows from CSV into SQL Table $SQLTempTable"  
ForEach ($CSVLine in $CSVImport)
{
$CSVRecordID = $CSVLine.RecordID
$CSVDataField1 = $CSVLine.DataField1
$CSVDataField2 = $CSVLine.DataField2

$SQLInsert = "USE $SQLTempDatabase  
INSERT INTO $SQLTempTable (RecordID, DataField1, DataField2)
VALUES('$CSVRecordID', '$CSVDataField1', '$CSVDataField2');"  

Invoke-SQLCmd -Query $SQLInsert -ServerInstance $SQLInstance -Username $SQLUsername -Password $SQLPassword

}

$SQLMerge = "MERGE $SQLDatabase.dbo.$SQLTable Target  
USING $SQLTempDatabase.dbo.$SQLTempTable Source
ON (Target.RecordID = Source.RecordID)
WHEN MATCHED 
     THEN UPDATE
     SET    Target.DataField1 = Source.DataField1,
            Target.DataField2 = Source.DataField2
WHEN NOT MATCHED BY TARGET
THEN INSERT (RecordID, DataField1, DataField2)
     VALUES (Source.RecordID, Source.DataField1, Source.DataField2);"        
Invoke-SQLCmd -Query $SQLMerge -ServerInstance $SQLInstance -Username $SQLUsername -Password $SQLPassword

$SQLDrop = "USE $SQLTempDatabase  
DROP TABLE $SQLTempTable;"        
Invoke-SQLCmd -Query $SQLDrop -ServerInstance $SQLInstance -Username $SQLUsername -Password $SQLPassword

$End = Get-Date
$TimeTaken = New-Timespan -Start $Start -End $End | Select -ExpandProperty TotalSeconds
$TimeTaken = [Math]::Round($TimeTaken, 0)
"CSV Import Finished In $TimeTaken Seconds"  

Leider bekomme ich hier ab diesen Block:

$SQLMerge = "MERGE $SQLDatabase.dbo.$SQLTable Target  
USING $SQLTempDatabase.dbo.$SQLTempTable Source
ON (Target.RecordID = Source.RecordID)
WHEN MATCHED 
     THEN UPDATE
     SET    Target.DataField1 = Source.DataField1,
            Target.DataField2 = Source.DataField2
WHEN NOT MATCHED BY TARGET
THEN INSERT (RecordID, DataField1, DataField2)
     VALUES (Source.RecordID, Source.DataField1, Source.DataField2);"        
Invoke-SQLCmd -Query $SQLMerge -ServerInstance $SQLInstance -Username $SQLUsername -Password $SQLPassword

Eine Fehlermeldung angezeigt:

Invoke-SQLCmd : Ungültiger Objektname "tempdb.dbo.CSVDataImport".   
 Meldung: 208, Ebene: 16, Zustand: 1, Prozedur: , Zeile: 1.
In C:\Users\User-01\Desktop\ImportingCSVsIntoSQLv1\ImportingCSVsIntoSQLv1-Import.ps1:63 Zeichen:1
+ Invoke-SQLCmd -Query $SQLMerge -ServerInstance $SQLInstance -Username ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [Invoke-Sqlcmd], SqlPowerShellSqlExecutionException
    + FullyQualifiedErrorId : SqlError,Microsoft.SqlServer.Management.PowerShell.GetScriptCommand

Wie bekomme ich das am besten behoben?

Ich freue mich auf eine Rückmeldung.

Content-ID: 619409

Url: https://administrator.de/forum/powershell-csv-import-in-sql-619409.html

Ausgedruckt am: 12.04.2025 um 12:04 Uhr

Doskias
Doskias 06.11.2020 um 07:45:25 Uhr
Goto Top
Moin,

Zitat von @dev-owl:
Wie bekomme ich das am besten behoben?

Was hast du denn schon versucht?

ich hab deine Fehlermeldung mal nach Google kopiert. Laut dem ersten Treffer hier fehlt bei dir ein
-Database [dbname]


Gruß
Doskias