【问题标题】:Invoke-sqlcmd with scripting variables and function parameters使用脚本变量和函数参数调用 sqlcmd
【发布时间】:2013-04-25 13:57:03
【问题描述】:

我有几张表需要定期清理(去重)。我想创建一个可以调用的函数并将表名作为参数传递。我坚持正确使用反引号 (`)、引号 (") 和括号来引用我试图作为函数参数传入的内联脚本变量 ($)。

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

【问题讨论】:

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


    【解决方案1】:

    您不应该使用反引号。使用反引号,变量值不会包含在查询字符串中。它看起来像:

    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;"
    

    【讨论】:

    • 比你。我现在明白了。
    【解决方案2】:

    问题在于 $dbtab 之前的反引号迫使双引号将美元符号视为文字而不是引入变量名。去掉反引号,这将起作用(并替换 $dbtab 的值)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-23
      • 2017-12-01
      • 2011-09-30
      相关资源
      最近更新 更多