/ / Powershell Invoke-Sqlcmd zu DataTable rowcount ist falsch, wenn sein 1 Datensatz - SQL-Server, Powershell

Powershell Invoke-Sqlcmd für DataTable-Zeilenanzahl ist falsch, wenn sein Datensatz 1 SQL Server, Powershell ist

$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 № 1

Wenn 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