robdox
Goto Top

Kein SQL Ergebnis im Powershellskript

Hallo zusammen,

ich verstehe leider nicht ganz, wieso mir kein Abfrageergebnis ausgespuckt wird? Die Abfrage habe ich vorher natürlich im SSMS geprüft. Stehe ich hier auf dem Schlauch? Hintergrund ist, dass ich gern die Ergebnisse in einem Array abspeichern möchte und damit gewissen Dateinamen in versch. Ordner durchsuchen will- jedoch wird nichts gefunden, wenn keine Abfrageergebnisse auftauchen.

# Variablen festlegen
$vPfad="C:\MAIL\"  
$vArchivPfad="C:\MAIL\SEND"  
$vCommand="  
			select sb.Nr_ListeA from Send_B sb 
					inner join Kund_B kb on kb.id=sb.ID_AG
			where 	kb.mc in (select ti.xs from Tabelle_B tb inner join Tabelle_F tf on tf.ID=tb.ID_Tabelle_F inner join Tabelle_It ti on ti.ID_Tabelle_B=tb.ID where tf.MC='CMR')  
					and sb.ID in (select ID_Send from Send_L where K_Li=4)
		  "  

# SQL Funktion zum zusammenstellen der Prüftabelle
function querySQL {
    Param(
        [string]$cSQL
    )
    # Connectionstring
    $connectionString = "Data Source=SERVER\db; Initial Catalog=db2_TBL; user id=sa; pwd=s4ZND64012518321OT"  

    # SQL Verbindung aufbauen
    $connection = new-object system.data.SqlClient.SQLConnection($connectionString)
    $command = new-object system.data.sqlclient.sqlcommand($cSQL,$connection)
    $connection.Open()
    $adapter = New-Object System.Data.sqlclient.sqlDataAdapter $command
    $dataset = New-Object System.Data.DataSet
    
    # Tabelle erstellen
    $adapter.Fill($dataSet) | Out-null
    $connection.Close()
    $dataSet.Tables
}

# SQL Tabelle in Array speichern
[array]$result = (querySQL -cSQL $vCommand).Datei

#Testausgabe der Abfrage = 0 
write-host $result 

# Liste aller Dateien durchsuchen, welche in Abfrage vorhanden sind
$files = Get-ChildItem -Path $vPfad -Include "(LISTDOC3)$result-*.pdf" -Recurse   

#Bsp. Dateiname: (LISTDOC3)123456-BMDF-001.pdf - 123456 befindet sich unteranderem im Abfrageergebnis

# Gefundene Dateien bereitstellen
$files | ?{$_.Basename -match $pattern} | Copy-Item -Destination $vArchivPfad -Verbose

Danke für sätmliche Hilfe!

Content-ID: 532563

Url: https://administrator.de/contentid/532563

Ausgedruckt am: 25.11.2024 um 18:11 Uhr

emeriks
emeriks 08.01.2020 aktualisiert um 11:10:03 Uhr
Goto Top
Hi,
Zeile 33: Warum "Datei"? Das ist doch in der Abfrage gar nicht enhalten?

Müsste es nicht lauten ..?
$result = (querySQL -cSQL $vCommand).sb.Nr_ListeA 

E.
robdox
robdox 08.01.2020 aktualisiert um 12:35:20 Uhr
Goto Top
Hi,

vielen Dank Dir! Das habe ich wohl übersehen von meinem vorherigen Skript, dennoch wird mir kein Wert ausgespuckt.

Im SSMS:
1800016
1800026
1800028
1800037

Im ISE:
...
# SQL Tabelle in Array speichern
[array]$result = (querySQL -cSQL $vCommand).sb.Nr_ListeA
write-host $result
...

Liefert:
PS C:\Users> C:\MAIL\CMR.ps1


PS C:\Users>

Ich bekomme keine gültige Ausgabe im Array hin.

Vielen Dank wieder vorab!
emeriks
Lösung emeriks 08.01.2020 um 12:50:31 Uhr
Goto Top
Das ist klar.
Mit
(querySQL -cSQL $vCommand)
fragst Du genau einen Datensatz ab, also ergibt
(querySQL -cSQL $vCommand).Nr_ListeA
auch nur genau einen Wert.
Hinweis! Das "sb." muss da noch raus.
Wenn Du da ein Array aller Werte haben willst, dann müsste das so aussehen:
(querySQL -cSQL $vCommand).Nr_ListeA
ohne das "".
robdox
robdox 08.01.2020 um 13:02:36 Uhr
Goto Top
Hy,

ja stimmt! Danke Dir! Die Abfrage funktioniert nun so wie ich mir das gewünscht habe.

Eine Frage, ist dann der Befehl richtig, dass ich mit dem Wert des Arrrays schauen, ob dieser im Dateinamen vorkommt und wenn ja, die Datei verschoben wird? Leider funktioniert diese Abfrage auch nicht.

# SQL Tabelle in Array speichern
[array]$result = (querySQL -cSQL $vCommand).Nr_ListeA
write-host $result # klappt!

# Liste aller Dateien durchsuchen
$files = Get-ChildItem -Path $vPfad -Include "(LISTDOC3)$result-*.pdf" -Recurse   
write-host $files # Ausgabe leer, kann man so mit Wildcards arbeiten?


# Entsprechend der Belegnummer, existierende Dateien auslesen
$pattern = ($result | %{[regex]::escape($_)}) -join "|" # hierbei wollte ich die Werte splitten und mit einer Pipe trennen  
Write-Host $pattern

# --- DEBUG ---
if(($files -eq $null) -or ($result -eq $null)) { write-host "Fehler bei Prüftabelle / Dateien" } #Fehlerbehandlung  

# Gefundene Dateien für Agenten bereitstellen
$files | ?{$_.Basename -match $pattern} | Copy-Item -Destination $vArchivPfad -Verbose #da $files leer, keine Aktion


Ich danke Dir wieder vorab!
robdox
robdox 08.01.2020 um 14:26:59 Uhr
Goto Top
Danke für die Hilfe, habe den Fehler gefunden.