$sql=("select top 1 * FROM CollectionProfile")
$CollectionProfile = New-Object System.Data.DataTable
$CollectionProfile = Invoke-Sqlcmd -ServerInstance $Instance -Database $db -Query $sql -ErrorAction Stop
$CollectionProfile.Rows.Count
RÜCKGABE: 0
Aber wenn ich den TOP Count auf 2 ändere -
$sql=("select top 2 * FROM CollectionProfile")
RÜCKGABE: 2
Das macht mich verrückt und ja, ich konnte in den "Innernets" keinen einzigen Hinweis darauf finden. Ich muss etwas falsch machen, aber WAS?
Antworten:
1 für die Antwort № 1Wenn Sie die Abfrage mit TOP 1 verwenden, rufen Sie-SqlCmd aufgibt eine DataRow zurück. Wenn Sie die Abfrage mit TOP 2 verwenden, gibt Invoke-SqlCmd ein Array von DataRows zurück. Invoke-SqlCmd gibt keine DataTable zurück. Sie können Ihren Code ändern, um die Rückgabe eines Arrays zu erzwingen (siehe hier: Array erzwingen), und überprüfen Sie dann die Zählung darauf:
$sql = ("select top 1 * FROM CollectionProfile")
$CollectionProfile = @(Invoke-Sqlcmd -ServerInstance $Instance -Database $db -Query $sql -ErrorAction Stop)
$CollectionProfile.Count #Returns 0 with Null, 1 with TOP 1, and 2 with TOP 2
0 für die Antwort № 2
Verwenden Sie einen der Spaltennamen aus der select-Anweisung anstelle von Rows, um eine korrekte Ergebniszählung zu erhalten.
In meinem Beispiel habe ich den Namen anstelle der Zeilen angegeben, die mein erster Spaltenname in der select-Anweisung "Select top 1 * from Sysdatabases" sind. So erhalten Sie das richtige Ergebnis für Top 1 oder Top 2.
$sql=("select top 1 * FROM sysdatabases")
$sysdatabases = New-Object System.Data.DataTable
$sysdatabases = Invoke-Sqlcmd -ServerInstance $Instance -Database $db -Query $sql -ErrorAction Stop
$sysdatabases.name.Count