2016-05-04 9 views
1
$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 

RETURNS:0PowerShellの起動-SQLCMDが間違っているときにその1レコードの

しかし、私は2へTOP回数を変更した場合 -

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

RETURNS:2

私を夢中にして、はい、私は "innernets"でこれに対する単一の参照を見つけることができませんでした。私は間違ったことをする必要がありますが、何ですか?

答えて

1

TOP 1でクエリを使用すると、Invoke-SqlCmdはDataRowを返します。 TOP 2でクエリを使用すると、Invoke-SqlCmdはDataRowの配列を返します。 Invoke-SqlCmdはDataTableを返しません。 、そしてそれに数を確認:あなたは(force arrayをここを参照してください):返される配列を強制するようにコードを変更することができ

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

Aha。私はデータテーブルを作成し、これがそのように動作するのに十分であると考えました。私は初心者ですので、私は自分で再訪する必要がありますが、この基本的な考え方を明確にしてくれてありがとう。 – MBuchanan

+1

ダガースありがとうございます。私の部分では非常に単純なコードの変更が、まだ私が定義していたデータテーブルの周りに私の頭を取得する必要があり、違いは何です。テーブルとは、言うことができる配列です。 invoke-sqlcmdコマンド全体は、PowerShell内のテーブル型になります。少なくとも、dbaが間違ったパスを引き継いで落とす可能性があります。私は学ぶべきことがたくさんある。 – MBuchanan

+0

@MBuchanan - Datatableを$ CollectionProfile変数に割り当てましたが、後でInvoke-Sqlcmdの戻り値を$ CollectionProfile変数に割り当てました。動的な型指定のため、$ CollectionProfileの型がDataTableからInvoke-Sqlcmdから返されるものに変更されました。希望が役立ちます。 – dugas

0

いずれかを使用した列名の列の代わりに、select文から、その意志正しい結果が得られる。

私の例では、select文 "Sysdatabasesからトップ1を選択"の最初の列名である行の代わりに名前を付けました。これにより、上位1または上位2の正しい結果が得られます。

関連する問題