Col*_*lin 0 sql-server variables powershell function 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
Run Code Online (Sandbox Code Playgroud)
我得到的错误是"$ dbtab'附近的语法不正确"或"未定义''dbtab'脚本变量'
你不应该使用反引号.使用反引号,变量值不会包含在查询字符串中.它看起来像:
SELECT DISTINCT * INTO #Temp FROM $dbtab; TRUNCATE TABLE $dbtab;
INSERT INTO $dbtab SELECT DISTINCT * FROM #Temp;
Run Code Online (Sandbox Code Playgroud)
如果没有反引号,变量值将被扩展,查询将如下所示:
SELECT DISTINCT * INTO #Temp FROM [FacilityBaseline]; TRUNCATE TABLE [FacilityBaseline];
INSERT INTO [FacilityBaseline] SELECT DISTINCT * FROM #Temp;
Run Code Online (Sandbox Code Playgroud)
所以,正确的$ query语句将是:
$query = "SELECT DISTINCT * INTO #Temp FROM $dbtab; TRUNCATE TABLE $dbtab;
INSERT INTO $dbtab SELECT DISTINCT * FROM #Temp;"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7339 次 |
| 最近记录: |