0

定期的にクリーニング (重複除去) する必要があるテーブルがいくつかあります。テーブル名をパラメーターとして呼び出して渡すことができる関数を作成したいと考えています。関数パラメーターとして渡そうとしているインライン スクリプト変数 ($) を参照するために、バック ティック (`)、引用符 (")、および括弧を適切に使用することに行き詰まっています。

「get-help invoke-sqlcmd -detailed」に注ぎ込み、-Variable オプションとのさまざまな組み合わせを試しましたが、成功しませんでした。

誰かが正しい構文で私を助けることができますか?

私の簡略化されたスクリプトは次のようになります-

# Define Server
$server = "AHDC389"  
# Define Database
$dbname = "VBP" 
# Define Table
$dbtab = "[FacilityBaseline]"   
# Import SQL svr handler
Import-Module “sqlps” -DisableNameChecking  
# Set env for SQL svr handler
Set-Location SQLSERVER:\SQL\$server\DEFAULT\Databases\$dbname
# Define my SQL query
$query = "SELECT DISTINCT * INTO #Temp FROM `$dbtab; TRUNCATE TABLE `$dbtab; 
INSERT INTO `$dbtab SELECT DISTINCT * FROM  #Temp;"
# Put Query in a Function for reuse
Function DeDup ([string] $dbtab) {
    Invoke-Sqlcmd -Query $query
}
# Call my Function and pass the Table name I want to dedup.
DeDup $dbtab

表示されるエラーは、「'$dbtab' 付近の構文が正しくありません」または「'dbtab' スクリプト変数が定義されていません」です。

4

2 に答える 2

5

バッククォートは使用しないでください。バックティックを使用すると、変数値はクエリ文字列に含まれません。次のようになります。

SELECT DISTINCT * INTO #Temp FROM $dbtab; TRUNCATE TABLE $dbtab; 
INSERT INTO $dbtab SELECT DISTINCT * FROM  #Temp;

バッククォートがないと、変数値が展開され、クエリは次のようになります。

SELECT DISTINCT * INTO #Temp FROM [FacilityBaseline]; TRUNCATE TABLE [FacilityBaseline]; 
INSERT INTO [FacilityBaseline] SELECT DISTINCT * FROM  #Temp;

したがって、正しい $query ステートメントは次のようになります。

$query = "SELECT DISTINCT * INTO #Temp FROM $dbtab; TRUNCATE TABLE $dbtab; 
INSERT INTO $dbtab SELECT DISTINCT * FROM  #Temp;"
于 2013-05-01T15:31:09.710 に答える
0

問題は、$dbtab の前のバッククォートが、変数名を導入するのではなく、ドル記号をリテラルとして扱うように二重引用符に強制していることです。バッククォートをドロップすると機能します (そして $dbtab の値を置き換えます)。

于 2013-05-01T15:31:06.640 に答える