Как использовать переменную в SQL из скрипта powershell - PullRequest
0 голосов
/ 16 мая 2018

Я пытаюсь запустить SQL из Power Shell (который находится на моем 64-битном рабочем столе Windows 7), а удаленный хост базы данных - 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 вместо $ var1, то сценарий te работает нормально и дает ожидаемый результат.

Quetion Но я хочу иметь возможность передавать любую строку как $ var1 в сценарий в качестве параметра.Затем используйте его в предложении where SQL.Как мне этого достичь?

Что я пытался Я пытался заключить $ var1 в 1,2 или 3 одинарных кавычки в предложении where, пытаясь избежать одиночной кавычки.Также попытался добавить / удалить одинарную кавычку из строки, когда $ var1 присвоено значение.Я тоже попробовал [string] $ var1 = 'string', но ни один из них не сработал, и я продолжаю получать сообщения об ошибках, в основном связанные с синтаксисом SQL.

1 Ответ

0 голосов
/ 16 мая 2018

Попробуйте это:

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
...