如何在SQL-Invoke命令中实现Where-Object

时间:2018-12-05 11:42:44

标签: sql-server powershell

我正在尝试从我的解决方案文件夹中存在的数据库中过滤一些表。我想过滤从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 :(得分:2)

您以错误的顺序使用了-notcontains operator的操作数。正确的语法是

reference_array -notcontains item

在您的情况下:

$existingTables -notcontains $_

$existingTables -notcontains $_.Name

如果不展开属性Name

如果要将引用数组用作第二个操作数,则必须使用-notin operator

$_ -notin $existingTables

但是,在PowerShell v3之前,该运算符不可用。

或者,您可以按照注释中的@vonPryz的建议,在SQL语句中添加exclude子句。不过,请注意不要对SQL injection开放。

不要执行此操作:

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

使用prepared statement(或Microsoft称为“参数化查询”)。但是,我无法识别您正在使用的cmdlet(似乎不是Invoke-Sqlcmd),所以我无法告诉您如何使用该cmdlet。