Invoke-sqlcmd包含脚本变量和函数参数

时间:2013-05-01 14:46:39

标签: sql-server function variables powershell parameter-passing

我有几个表需要定期清理(重复数据删除)。我想创建一个我可以调用的函数,并将表名作为参数传递。我坚持使用back tics(`),引号(“)和括号来引用内联脚本变量($),我试图将其作为函数参数传入。

我已经倾倒了“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'脚本变量未定义'

2 个答案:

答案 0 :(得分: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;"

答案 1 :(得分:0)

问题是$ dbtab之前的反引号强制双引号将美元符号视为文字,而不是引入变量名。删除反引号,这将起作用(并替换$ dbtab的值)。