2013-05-01 69 views
0

我有幾個表需要定期清理(去重複)。我想創建一個函數,我可以調用並傳入一個表名作爲參數。我堅持使用back tics(`),引號(「)和括號來引用內聯腳本變量($),我試圖將其作爲函數參數傳入。帶腳本變量和函數參數的Invoke-sqlcmd

我倒了「得到的幫助調用-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'腳本變量未定義附近的語法錯誤'

回答

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 = "SELECT DISTINCT * INTO #Temp FROM $dbtab; TRUNCATE TABLE $dbtab; 
INSERT INTO $dbtab SELECT DISTINCT * FROM #Temp;" 
+0

比你。我現在知道了。 – Colin 2013-05-01 16:35:57

0

問題是,$ dbtab之前的反引號強制雙引號將美元符號視爲文字而不是引入一個變量名。刪除反引號,這將起作用(並替換$ dbtab的值)。