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