Как реализовать Where-Object в команде SQL-Invoke - PullRequest
0 голосов
/ 05 декабря 2018

Я пытаюсь отфильтровать некоторые таблицы из моей базы данных, которая существует в моей папке решения.Я хочу отфильтровать все таблицы, которые я извлекаю из SQL Server:

$existingTables = "Table1", "Table2", "Table3", "Table4"

#getting all tables except existing ones
#SqlQuery = "SELECT name FROM sys.Tables order by name asc"
$filteredTables = ((Invoke-SQL -DataSource $ServerName -DatabaseName $DatabaseName -UserID $UserID -Password $Password -SqlCommand $SQLQuery).name | ? {$_ -notcontains $existingTables})
#$filteredTables returns all tables, including the existing ones...

Я пробовал $_.name, и это тот же результат.

1 Ответ

0 голосов
/ 05 декабря 2018

Вы используете операнды оператора -notcontains в неправильном порядке.Правильный синтаксис:

reference_array -notcontains item

В вашем случае:

$existingTables -notcontains $_

или

$existingTables -notcontains $_.Name

, если вы не расширяете свойство Name.

Если вы хотите использовать массив ссылок в качестве второго операнда, вы должны использовать оператор -notin :

$_ -notin $existingTables

Однако этот оператор недоступен до PowerShellv3.

В качестве альтернативы, вы можете добавить предложение исключить в ваш оператор SQL, как предложено в комментариях @ vonPryz .При этом старайтесь не открывать себя для SQL-инъекции .

Не делайте это:

$SQLQuery = @"
SELECT ...
FROM ...
WHERE name NOT IN (<strike>'$($existingTables[0])', '$($existingTables[1])', ...</strike>)
"@

Используйте подготовленный оператор (или «параметризованный запрос», как их называет Microsoft).Однако я не распознаю используемый вами командлет (кажется, что он не Invoke-Sqlcmd), поэтому я не могу рассказать вам, как это сделать с помощью этого командлета.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...