【问题标题】:How to use variable in SQL from powershell script如何从 powershell 脚本中使用 SQL 中的变量
【发布时间】:2018-05-15 22:18:49
【问题描述】:

我正在尝试从 Power Shell(在我的 windows 7 64 位桌面上)运行 SQL,远程数据库主机是 MS SQL Server 2012。

代码为:

$var1 = 'string';

function Get-ODBC-Data{
   param(
   [string]$query=$('
                SELECT COUNT(*)
                FROM [master].[sys].[table_name]                
                                WHERE col2 = ''$var1''
                                ;
'),
   [string]$username='db_user_name',
   [string]$password='db_password'
   )
   $conn = New-Object System.Data.Odbc.OdbcConnection
   $conn.ConnectionString = "DRIVER={SQL Server};Server=123.456.78.90;Initial Catalog=master;Uid=$username;Pwd=$password;"
   $conn.open()
   $cmd = New-object System.Data.Odbc.OdbcCommand($query,$conn)
   $ds = New-Object system.Data.DataSet
   (New-Object system.Data.odbc.odbcDataAdapter($cmd)).fill($ds) | out-null
   $conn.close()
   $ds.Tables[0]
}

 $result = Get-ODBC-Data

Write-Host "SQL_Output: " $result[0];

如果我在 SQL 的 where 子句中使用“字符串”而不是 $var1,那么脚本可以正常工作并给出预期的结果。

问题 但我希望能够将任何字符串作为 $var1 作为参数传递给脚本。然后在 SQL 的 where 子句中使用它。我怎样才能做到这一点?

我尝试了什么 我试图将 $var1 括在 where 子句中的 1,2 或 3 个单引号中,以试图转义单引号。当 $var1 被赋值时,还尝试从“字符串”中添加/删除单引号。我也尝试过 [string]$var1 = 'string' 但这些都不起作用,而且我不断收到主要与 SQL 语法相关的错误。

【问题讨论】:

  • 不确定您是否可以在参数默认值中执行此操作。您可能需要一个反引号来转义单引号。您可以使用 + 连接字符串,所以...$query ='Where col = `'' + $var1 + '`'; 应该可以工作。为什么不创建查询 Inc 值,然后执行语句。
  • 感谢您的回复。使用 $query ='Where col = '' + $var1 + ''; 给出语法错误:Unexpected token ''' in expression or statement`。我愿意尝试不同的方法。你能给我一些关于在 Inc 中创建查询然后执行语句的想法吗?我不知道。

标签: powershell sql-server-2012


【解决方案1】:

试试这个:

function Get-ODBC-Data{
   param(
   [string]$query=$("
                SELECT COUNT(*)
                FROM [master].[sys].[table_name]                
                                WHERE col2 = '$($var1)'
                                ;
"),
   [string]$username='db_user_name',
   [string]$password='db_password'
   )
   $conn = New-Object System.Data.Odbc.OdbcConnection
   $conn.ConnectionString = "DRIVER={SQL Server};Server=123.456.78.90;Initial Catalog=master;Uid=$username;Pwd=$password;"
   $conn.open()
   $cmd = New-object System.Data.Odbc.OdbcCommand($query,$conn)
   $ds = New-Object system.Data.DataSet
   (New-Object system.Data.odbc.odbcDataAdapter($cmd)).fill($ds) | out-null
   $conn.close()
   $ds.Tables[0]
}

 $result = Get-ODBC-Data

Write-Host "SQL_Output: " $result[0];

以下在我的设置上运行良好,并显示了正确的结果:

$var1 = "test22"

function Get-ODBC-Data{
   param(
   [string]$query=$("
                SELECT COUNT(*)
                FROM [master].[sys].[table_name]                
                                WHERE col2 = '$($var1)'
                                ;
"),
   [string]$username='db_user_name',
   [string]$password='db_password'
   )

   return $query

}

$result = Get-ODBC-Data

Write-Host " ################### Query ######################## "
Write-Host $result

但是,将整个查询作为参数传递给函数而不是查询的一个变量部分可能会更容易。

或将其设置在函数内部并将 $var1 作为强制参数传递,如下所示:

function Get-ODBC-Data{
   param(
   [parameter(Mandatory=$true)][string]$var1,
   [string]$username='db_user_name',
   [string]$password='db_password'
   )
   $query="
                SELECT COUNT(*)
                FROM [master].[sys].[table_name]                
                                WHERE col2 = '$($var1)'
                                ;"

   return $query

}

$result = Get-ODBC-Data -var1 "working"

Write-Host " ################### Query ######################## "
Write-Host $result

【讨论】:

  • 感谢您的回复。使用WHERE col2 = '$($var1)' 会产生语法错误:Unexpected token '$(' in expression or statement。我还尝试使用WHERE col2 = ''$($var1)'',它不会给出语法错误但显示错误:Cannot index into null array 我认为这表明 SQL 没有获取任何数据。
  • 您是否也使用 " 而不是 ' 来包装查询?
  • 太完美了!我在 SQL 周围有单引号而不是双引号,这就是语法错误的原因。 The following runs fine on my setup, and shows the correct results: 我正在使用该版本,它也按预期工作。非常感谢您回复建议。
  • 没问题,我仍然建议使用最后一段代码,因为它可以让您更好地控制 $var1 是什么。您不必每次都设置它,只需将其作为参数传递给函数即可。
  • 我不得不升级这个脚本,现在我正在使用你答案的第二个和第三个版本。我在stackoverflow.com/q/50418878/3209087 提出了一个新问题,如果您有时间可以看看这个问题,我将不胜感激。我认为这与可能需要循环有关。
猜你喜欢
  • 1970-01-01
  • 2014-08-09
  • 2017-06-15
  • 1970-01-01
  • 2019-07-30
  • 2021-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多