web-dev-qa-db-ja.com

SQL Serverでのファイルに保存されたクエリでのPowerShell変数の使用

PSのラッパー関数を使用してSQLコマンドを実行し、Powershellを介してSQLを実行しようとしています。また、私のSQLは独自の独立したファイルにあり、Powershellスクリプトにインラインでハードコードされていません。これにより、私がやろうとしていることは簡単になります。 SQL Serverでできることは、Powershell変数にアクセスして、送信するクエリでそれを使用することです。 xp_cmdshellは、これを実行するための潜在的なオプションとして登場しますが、必要がない限り、すぐにセキュリティの脆弱性にさらされることはありません。

ここに私の考えをより簡単にするためのいくつかの疑似コードがあります:

PSScript.ps1:

$var = 1
$query = query.sql
$con = connection(server_connection_params)
$command = New-Object System.Data.SqlClient.SqlCommand $sqlCommand,$connection
$command.ExecuteScalar()

Query.sql:

SELECT * FROM table WHERE field = $var;

私がアクセスできる方法はありますか$var PowershellでSQLを呼び出す方法を考えると、この方法で?

2
Dylan Bacon

あなたが指定したサンプルクエリは基本的なものであるため、私の提案は基本的なものですが、複数の変数を渡したり置換したりする必要がある複雑なスクリプトファイルでも機能するはずです。

ここで重要なのは、PowerShellで簡単に検索できるスクリプトファイルにプレースホルダーを用意し、その値を使用してreplaceにするだけです。

クエリの例:

SELECT * FROM sys.databases WHERE name = 'var1'

この例では、ファイルからクエリを取得し、var1値を検索して、クエリしたいデータベース名に置き換えます...

$var = 'MyDatabase'
$query = Get-Content .\Sample.sql | foreach {$_.replace("var1",$var)}

使用例:

enter image description here

3
user507

_System.Data.SqlClient.SqlCommand_を使用する代わりに外部ユーティリティを呼び出すことができる場合、これは sqlcmd.exeおよびスクリプト変数 を使用して簡単に解決できます。

Query.sqlファイルに次のように記述します。

SELECT * FROM table WHERE field = '$(var)';

そして、次のように_sqlcmd.exe_を呼び出します:

_sqlcmd -S <your server name> -b -i Query.sql -v var=$var_

  • _-S_は、接続するサーバーを指定します。
  • _-b_は、「バッチモード」をオンにします。エラーが発生すると、後続のコマンドが中止されます。
  • _-i_は指定されたファイルからSQLを実行します
  • _-v_置換する変数の名前

複数の変数を置き換える必要がある場合は、複数の_-v_フラグを指定できます。

1
dpw