2017-12-03 7 views
0
$uncServer = "\\10.243.174.102\e$" 
$uncFullPath = "$uncServer\New folder\Demo.txt" 
$username = "XYZ" 
$password = "xyz" 

net use $uncServer $password /USER:$username 


$SQLServer = "AP-PUN-SRSTEP29\MSSQLSERVER12" #use Server\Instance for named SQL instances! 
$SQLDBName = "SystemDB" 
$SqlQuery = "Delete * from V_Solution WHERE Notes ='9.4.4'"; 

$SqlConnection = New-Object System.Data.SqlClient.SqlConnection 
$SqlConnection.ConnectionString = "Server = $SQLServer; Database = $SQLDBName; Integrated Security = True" 
#$SqlConnection.open() 


$SqlCmd = New-Object System.Data.SqlClient.SqlCommand 
$SqlCmd.CommandText = $SqlQuery 
$SqlCmd.Connection = $SqlConnection 

$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter 
$SqlAdapter.SelectCommand = $SqlCmd 

リモートサーバーにSQL Server 2012がインストールされており、PowerShellスクリプトを使用してローカルマシンから特定のデータベースの特定のテーブルから行を削除したいとします。それは可能ですか?PowerShellスクリプトを使用してSQL Serverのテーブルから行を削除する方法はありますか?

+2

SO doesntの仕事、あなたのコードは何でここでの例の抜粋ですか?何を試しましたか? – Esperento57

+0

Hey hi esperento、実際に私はその時に私とコードを持っていなかったので、私はそれをアップロードできませんでしたが、私は質問を編集し、コードをアップロードしましたが、私はGoogleで検索してみましたが、それで私を助けてください。 – SRP

答えて

1

1つの方法では、どの.NETアプリケーションと同様にADO.NETオブジェクトを使用しています。以下のPowerShellの例では、SQLツールをインストールする必要はありません。

$connectionString = "Data Source=YourServer;Initial Catalog=YourDatabase;Integrated Security=SSPI"; 
$connection = New-Object System.Data.SqlClient.SqlConnection($connectionString); 
$command = New-Object System.Data.SqlClient.SqlCommand("DELETE FROM dbo.YourTable WHERE YourTableID = 1", $connection); 
$connection.Open(); 
$rowsDeleted = $command.ExecuteNonQuery(); 
Write-Host "$rowsDeleted rows deleted"; 
$connection.Close(); 

接続文字列でUser ID=YourSqlLogin;Password=YourSqlLoginPasswordを指定し、SQL認証を使用してクエリを実行するには:、Windows認証を使用してクエリを実行し、接続文字列でIntegrated Security=SSPIを指定するに

$connectionString = "Data Source=YourServer;Initial Catalog=YourDatabase;User ID=YourSqlLogin;Password=YourSqlLoginPassword"; 
$connection = New-Object System.Data.SqlClient.SqlConnection($connectionString); 
$command = New-Object System.Data.SqlClient.SqlCommand("DELETE FROM dbo.YourTable WHERE YourTableID = 1", $connection); 
$connection.Open(); 
$rowsDeleted = $command.ExecuteNonQuery(); 
Write-Host "$rowsDeleted rows deleted"; 
$connection.Close(); 

いずれの場合も、テーブルのアクセス権はDELETEである必要があります。

質問に追加したスクリプトのNET USEコマンドの目的は、ワークグループ環境でサーバーに認証されている場合を除いてわかりません。個人的には、私はSQL認証を使用し、NET USEの醜さを取り除きます。

EDIT:同じバッチ内の複数SELECT文の場合

、それぞれが別々のレコードセットを返します。

また
$reader = $command.ExecuteReader(); 
do { 
    While($reader.Read()) { 
     #process row here; 
    } 
} while($reader.NextResult()); 

、あなたは「データセット」を埋めるためにDataAdapterを使用することができます。これは、これ以上のレコードが利用できないときは、falseを返しますDataReaderを、使用している場合NextRecordsetを呼び出す必要があります。 DataSetは、各結果セットに別々のDataTableが含まれています:

$da = New-Object System.Data.SqlClient.SqlDataAdapter($command); 
$ds = New-Object System.Data.DataSet; 
$null = $da.Fill($ds); 
foreach($dt in $ds.Tables) { 
    $dt | Out-GridView; 
} 

ます。また、カラムとデータ型の数が同一である場合UNION ALLを使用して、単一の結果セットに結果を連結するために、SQLクエリを微調整することができます。

$sqlQuery = @(" 
SELECT * 
FROM DB926.dbo.Version_Solution 
WHERE Notes ='9.2.7' 
UNION ALL 
SELECT * 
FROM DB_926.dbo.Version_Solution 
WHERE Notes ='9.2.7'"; 
); 
$command = New-Object System.Data.SqlClient.SqlCommand($sqlQuery, $connection); 
+0

上記のコードを使用する際に、上記のコメントにも同じエラーが発生します。 – SRP

+0

はい、私は接続文字列でユーザーIDとパスワードを追加して試してみましたが、SQLServerがリモートマシンにインストールされていて、すべての変更コードが完璧に動作していたために必要と思われる不要なNET USEコードも削除しました。とにかく助けてくれてありがとう:-) – SRP

+0

こんにちはDan Guzman、2つの異なるデータベースにあるテーブルからエントリを削除することは可能ですか?私は最初のCatalog = "DB1"、 "DB2"などの2つの異なるデータベース名を与えようとしましたが、エラーが出ます。他のDBからのエントリを削除するために同じコードを再度繰り返すのではなく、別のデータベースのコードを追加する必要があります。 – SRP

1

変更するには、このようなあなたのコード:あなたのための

$uncServer = "\\10.243.174.102\e$" 
$uncFullPath = "$uncServer\New folder\Demo.txt" 
$username = "XYZ" 
$password = "xyz" 

net use $uncServer $password /USER:$username 


$SQLServer = "AP-PUN-SRSTEP29\MSSQLSERVER12" #use Server\Instance for named SQL instances! 
$SQLDBName = "SystemDB" 
$SqlQuery = "Delete from V_Solution WHERE Notes ='9.4.4'"; 

$SqlConnection = New-Object System.Data.SqlClient.SqlConnection 
$SqlConnection.ConnectionString = "Server = $SQLServer; Database = $SQLDBName; Integrated Security = True" 
$SqlConnection.open() 


$SqlCmd = New-Object System.Data.SqlClient.SqlCommand 
$SqlCmd.CommandText = $SqlQuery 
$SqlCmd.Connection = $SqlConnection 

$SqlCmd.ExecuteNonQuery 
$SqlConnection.Close() 
+0

こんにちはEsperento57、上記のコードは、例外 "$ SqlConnection.open()"例外 "0"引数で "オープン"を呼び出す "ユーザー 'XYZ'のログインに失敗しました。上記のユーザー名とパスワードは、SQLServerがインストールされているリモートマシン用です。SQLServerの資格情報を与える必要がある場合は、どこに、どのようにしたらいいですか? – SRP

+0

こんにちはEsperento57、私は最初のカタログ= "DB1"、 "DB2"の2つの異なるデータベース名を与えようとしましたが、それは私にエラーを与えていますどのように私は別のデータベースのコードを追加する必要があります – SRP

+0

いいえ、Dan Guzmanによって与えられた上記の答えがコメントでうまくいきました。これは、2つの異なるdatに存在するテーブルからエントリを削除しました。データベースは同じサーバー上にありました。 – SRP

関連する問題