PowerShell中Invoke-Sqlcmd调用存储过程变量传参报语法错误
问题原因
你遇到的语法错误是因为变量替换后,SQL语句中的路径参数没有被单引号包裹。
直接执行的命令里,你手动给路径加了单引号'C:\Users\User1\D3R\staging\returns\',SQL能正确识别这是字符串参数;但用变量后,PowerShell会把$FileDirectory的内容直接替换到双引号字符串中,最终生成的SQL语句变成:
EXEC spImportReturn @FileDirectory = C:\Users\User1\D3R\staging\returns\
SQL解析时会把C:当成非法语法,所以报错"Incorrect syntax near 'C:'"。你给变量加的引号是PowerShell层面的,只会让PowerShell正确识别变量值,不会自动传递到SQL语句里。
解决方案
有两种可靠的解决方式:
方式1:在SQL字符串中给变量添加单引号
修改-Query参数的内容,给$FileDirectory套上单引号,确保替换后的SQL语句包含字符串所需的引号:
$FileDirectory = "C:\Users\User1\D3R\staging\returns\" Invoke-Sqlcmd -ServerInstance "LONSQL01\SQLEXPRESS" -Database "ReturnsDatabase" -Query "EXEC spImportReturn @FileDirectory = '$FileDirectory'" -verbose 4> C:\Temp\DbAdmin\ImportD3RReturn\ImportD3rReturn.txt
替换后生成的SQL语句会是:
EXEC spImportReturn @FileDirectory = 'C:\Users\User1\D3R\staging\returns\'
符合SQL的语法要求。
方式2:使用参数化查询(推荐)
这是更安全的做法,能避免潜在的SQL注入风险,也不用手动处理引号:
$FileDirectory = "C:\Users\User1\D3R\staging\returns\" $sqlParams = @{ FileDirectory = $FileDirectory } Invoke-Sqlcmd -ServerInstance "LONSQL01\SQLEXPRESS" -Database "ReturnsDatabase" -Query "EXEC spImportReturn @FileDirectory = @FileDirectory" -Parameter $sqlParams -verbose 4> C:\Temp\DbAdmin\ImportD3RReturn\ImportD3rReturn.txt
通过-Parameter参数传递存储过程的参数,PowerShell会自动处理参数的格式转换和引号问题。
内容的提问来源于stack exchange,提问作者ChrisAsi71
相关产品推荐
相关产品推荐

