【问题标题】:Invoke-SQLCMD in powershell在 powershell 中调用-SQLCMD
【发布时间】:2026-01-15 01:50:01
【问题描述】:

很抱歉这个琐碎的问题,但是...

我在尝试使用调用命令在 PowerShell 中执行 SQL 命令时遇到问题

当我尝试将字符串添加到 SQL 命令时,问题就开始了:

$sqlNAVresutl = Invoke-SQLCMD -Query 'SELECT *
FROM [dbo].[DBO name]
WHERE [dbo].[Job Queue Entry].Status = 2 AND [dbo].[$Job Queue Entry].[Object ID to Run] = 52063060 AND [dbo].[$Job Queue Entry].[User ID] = 'Domain\Account'
GO
' 
 -ServerInstance "Server name" -Database "dbo name"

当我将Domain\Account 添加到代码中时,问题就开始了。它适用于 SQL,但不适用于 PowerShell,因为整个查询用单引号 (' ')。

如何读取单引号内的字符串?

【问题讨论】:

  • 使用双单引号:` = ''Domain\Account''`。
  • 我收到错误 Invoke-SQLCMD : Invalid column name 'Domain\Account'。
  • 对于多行 SQL,您通常最好使用这里字符串 (@" .... "@),这样您就不必担心转义($ 除外,如果它可以启动一个变量名称,因为它仍然会被插值——如果你真的需要在查询中使用文字 $,你可以使用 `$ 来逃避它。
  • @AjeetVerma 请为实际的 code 保留代码格式(使用反引号),不要将其用于强调或围绕首字母缩略词。您建议的许多编辑都误用了这种格式。具有讽刺意味的是,对于适合反引号的一种用途,您改为使用** 强调。看看我对这个问题的编辑,看看我的意思。

标签: sql powershell invoke-sqlcmd


【解决方案1】:

-Query 可以使用双引号,例如 -ServerInstance-Database

【讨论】:

  • 我也遇到了错误 .. Invoke-SQLCMD:无效的对象名称“dbo.Queue Entry”。在 line:1 char:17 + $sqlNAVresutl = Invoke-SQLCMD -Query "SELECT * + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (:) [Invoke-Sqlcmd], SqlPowerShellSqlExecutionException + FullyQualifiedErrorId : SqlError,Microsoft.SqlServer.Management.PowerShell.GetScriptCommand
  • 如果您的美元符号不在变量名之前,请使用反引号 (`$) 对其进行转义。
  • 好吧,不知何故我想通了.....现在它可以工作但很奇怪:)
【解决方案2】:

要在 PowerShell 中在字符串文字中嵌入 '(单引号),您有 3 个选项:


单引号字符串 ('...') 中,加倍它们:

# ' doubled
'Honey, I''m home.'

单引号字符串被以其他方式解释逐字,因此没有其他字符。需要逃跑。

相反,这意味着不会在此类字符串中扩展(插值)变量引用或表达式;如果需要 - 例如,如果您的查询字符串中的 $Job 是指在 PowerShell 中定义的 $Job 变量的值 - 您必须使用 - 引号字符串 ("...") - 见下文。


在单引号 here-strings (@'<newline>...<newline>'@) 中,您根本不需要转义 '

单引号字符串的这种总是多行的变体不需要任何字符的转义。

# No escaping needed (ignore the broken syntax highlighting)
@'
Honey, I'm home.
'@

注意:结尾的'@ 必须在行的最开始 - 甚至不允许前面的空格。


双引号字符串 ("...") 中,您根本不需要转义 '

但是,由于此类可扩展字符串(插值字符串)在设计上将$解释为变量引用的开始(例如, $var)或子表达式(例如$(1+2)),然后您必须转义literal $ 字符。作为`$

  • `(反引号)通常用作 PowerShell 中的转义字符(请参见下面的链接),因此您可以类似地使用 `" 转义嵌入的 " 字符。

  • 需要转义文字 $ 字符。因为`$ 同样适用于可扩展字符串的here-string 变体
    (@"<newline>...<newline>"@),但嵌入的" 不需要转义。 p>

# No escaping of ', but literal $ must be escaped as `$
"Honey, I'm home; I hate my `$Job."

另见:

  • about_Quoting_Rules,关于字符串文字的官方帮助主题。
    • about_Special_Characters,它解释了 双引号 字符串中支持的以` 为前缀的转义序列,例如`t 以表示制表符。请注意,Windows PowerShell 支持的序列少于 PowerShell [Core] 6+。
  • This answer,详细解释可扩展字符串(字符串插值)。

【讨论】: