Dynami c SQL Где условие, в скрипте Powershell - PullRequest
0 голосов
/ 18 января 2020

Я работаю над сценарием Powershell, в котором результат запроса № 1 - это где фид условий для запроса № 2, но он не получает фид, если кто-то, пожалуйста, посмотрит и расскажет, какие могут быть возможные решения для этого.

Также обратите внимание, что в реальной среде оба запроса выполняются в разных экземплярах, и нет никаких возможностей для связанного сервера

Ниже приведен пример того, что я пробовал в базе данных AdventureWorks:

$instance="WIN2016-SQL01\SQLSERVER_01"
$database = "AdventureWorks2014"
$query1 = "SELECT TOP 10 [BusinessEntityID]   FROM [AdventureWorks2014].[Person].[BusinessEntityAddress] where BusinessEntityID < 10 order by 1 "
$Q1 = (invoke-sqlcmd -query $query1 -ServerInstance $instance -Database $database)

$query2 = "SELECT *   FROM [AdventureWorks2014].[Person].[Person] where BusinessEntityID in ($Q1)"
$Q2 = invoke-sqlcmd -query $query2 -ServerInstance $instance -Database $database 

Ответы [ 2 ]

1 голос
/ 18 января 2020

Или вы можете просто создать строку с разделителями для замены вашего предложения IN:

$instance="localhost"
$database = "AdventureWorks2017"
$query1 = "SELECT TOP 10 [BusinessEntityID] FROM [Person].[BusinessEntityAddress] where BusinessEntityID < 10 order by 1 "
$Q1 = (invoke-sqlcmd -query $query1 -ServerInstance $instance -Database $database)

$ids = ""
foreach ($r in $Q1)
{
  $ids += ","  + $r.BusinessEntityID
}

$ids = $ids.Substring(1)

$query2 = "SELECT * FROM [Person].[Person] where BusinessEntityID in ($ids)"
$Q2 = invoke-sqlcmd -query $query2 -ServerInstance $instance -Database $database 

$Q2 | format-table 
0 голосов
/ 18 января 2020

Список значений может быть передан как параметр XML в запрос, где XML методы могут быть использованы для извлечения значения. Строковое значение JSON является параметром в SQL 2016 и более поздних версиях, но я вижу, что вы находитесь на SQL Server 2014.

В приведенном ниже примере преобразован список результатов Q1 значений BusinessEntityID в XML значение параметра. Поскольку Invoke-SqlCmd не поддерживает параметризованные запросы, необходимо напрямую использовать объекты SqlClient. Альтернативой Invoke-SqlCmd является Invoke-DbaQuery от dbatools, который поддерживает параметризованные запросы, если у вас есть такая возможность.

$instance="WIN2016-SQL01\SQLSERVER_01"
$database = "AdventureWorks2014"
$query1 = "SELECT TOP 10 [BusinessEntityID]   FROM [AdventureWorks2014].[Person].[BusinessEntityAddress] where BusinessEntityID < 10 order by 1 "
$Q1 = (invoke-sqlcmd -query $query1 -ServerInstance $instance -Database $database)

$list = @()
foreach ($row in $Q1)
{   
    $list += $row["BusinessEntityID"]
}
$listXml = $list | ConvertTo-Xml -NoTypeInformation
$listXmlString = $x.Objects.InnerXml

$query2 = "SELECT * 
FROM [AdventureWorks2014].[Person].[Person] 
WHERE BusinessEntityID IN (
    SELECT item.value('.','int')
    FROM @list.nodes('/Object') AS list(item)
    );"

$connectionString = "Data Source=$instance;Initial Catalog=$database;Integrated Security=SSPI"
$connection = New-Object System.Data.SqlClient.SqlConnection($connectionString)
$command = New-Object System.Data.SqlClient.SqlCommand($query2, $connection)
$dataAdapter = New-Object System.Data.SqlClient.SqlDataAdapter($command)
($command.Parameters.Add("@list", [System.Data.SqlDbType]::Xml)).Value = $listXmlString
$Q2 = New-Object System.Data.DataTable
$dataAdapter.Fill($Q2)
...