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を呼び出す方法を考えると、この方法で?
あなたが指定したサンプルクエリは基本的なものであるため、私の提案は基本的なものですが、複数の変数を渡したり置換したりする必要がある複雑なスクリプトファイルでも機能するはずです。
ここで重要なのは、PowerShellで簡単に検索できるスクリプトファイルにプレースホルダーを用意し、その値を使用してreplace
にするだけです。
クエリの例:
SELECT * FROM sys.databases WHERE name = 'var1'
この例では、ファイルからクエリを取得し、var1
値を検索して、クエリしたいデータベース名に置き換えます...
$var = 'MyDatabase'
$query = Get-Content .\Sample.sql | foreach {$_.replace("var1",$var)}
使用例:
_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
_フラグを指定できます。