我正在尝试从我的解决方案文件夹中存在的数据库中过滤一些表。我想过滤从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
,结果是一样的。
答案 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。