/ / Powershell Invoke-Sqlcmd do DataTable rowcount jest niepoprawny, gdy jego 1 rekord - sql-server, powershell

Powershell Invoke-Sqlcmd do DataTable rowcount jest niepoprawny, gdy jego 1 rekord - serwer sql, powershell

$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

ZWROTY: 0

Ale jeśli zmienię TOP licznik na 2 -

$sql=("select top 2 * FROM CollectionProfile")

ZWROTY: 2

Doprowadzając mnie do szału i tak, nie mogłem znaleźć ani jednego odniesienia do tego w „sieciach wewnętrznych”. Muszę robić coś złego, ale CO?

Odpowiedzi:

1 dla odpowiedzi № 1

Gdy używasz zapytania z TOP 1, Invoke-SqlCmdzwraca DataRow. Gdy używasz zapytania z TOP 2, Invoke-SqlCmd zwraca tablicę DataRows. Invoke-SqlCmd nie zwraca DataTable. Możesz zmienić kod, aby wymusić zwrócenie tablicy (patrz tutaj: wymuś tablicę), a następnie sprawdź Licznik:

$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 dla odpowiedzi nr 2

Użyj jednej z nazw kolumn z instrukcji select zamiast wierszy, co da poprawną liczbę wyników.

Tutaj w moim przykładzie zamiast wierszy podałem nazwę, która jest nazwą mojej pierwszej kolumny w instrukcji select „Select top 1 * from Sysdatabases”. To da ci poprawny wynik dla pierwszej 1 lub pierwszej 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