Invoke-Sqlcmd:SQL PowerShell中不允许重复的列名

时间:2018-08-07 00:32:59

标签: sql-server powershell invoke-sqlcmd

我在14个查询中吐出了Glenn Berry's Performance Query,但其中一个(编号9)无法正常工作。

这是我的PowerShell代码:

#Provide SQLServerName
$SQLServer ="localhost"
#Provide Database Name 
$DatabaseName ="master"
#Prompt for user credentials 
$credential = Get-Credential 

$Query1= "-- 09 Index Sizes
-- Note: THIS IS SLOW as it reads index blocks. SAMPLED is not that high, but watch for prod I/O impact if using 'DETAILED'
SELECT DB_NAME() AS DatabaseName,
 Object_name(i.object_id) AS TableName
   ,i.index_id, name AS IndexName
   ,i.type_desc
   ,ips.page_count, ips.compressed_page_count
   ,CAST(ips.avg_fragmentation_in_percent as DECIMAL(5,1)) [fragmentation_pct]
   ,CAST(ips.avg_page_space_used_in_percent as DECIMAL(5,1)) [page_space_used_pct]
   ,ips.index_depth, ips.page_count ,ips.forwarded_record_count, ips.record_count
  FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, 'SAMPLED') AS ips -- or SAMPLED
    INNER JOIN sys.indexes AS i ON ips.object_id = i.object_id AND ips.index_id = i.index_id
where ips.page_count > 1
ORDER BY ips.record_count desc;"

Invoke-Sqlcmd  -Database $DatabaseName -ServerInstance $Server -Credential $credential -Query $Query1 | Format-Table 

enter image description here

返回的错误说:

Invoke-Sqlcmd : Duplicate column names are not permitted in SQL PowerShell. To repeat a column, use a column alias for the duplicate
column in the format Column_Name AS New_Name.
At C:\Users\FrancescoM\Desktop\CSV\Test.ps1:23 char:1
+ Invoke-Sqlcmd  -Database $DatabaseName -ServerInstance $Server -Crede ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : SyntaxError: (:) [Invoke-Sqlcmd], SqlPowerShellSqlExecutionException
    + FullyQualifiedErrorId : DuplicateColumnNameErrorMessage,Microsoft.SqlServer.Management.PowerShell.GetScriptCommand

不确定重复列是什么,因为如果我在SSMS上运行调用PowerShell脚本的查询,我看不到任何重复列:

enter image description here

3 个答案:

答案 0 :(得分:0)

我到达家乡后,我以一种体面的方式格式化了查询的格式,这要感谢Notepad ++,在单击每列之后,我发现ips.page_count被调用了两次。

所以确实有一列叫做两次。

enter image description here

答案 1 :(得分:0)

对Invoke-Sqlcmd命令使用以下参数。

-OutputSqlErrors $ False

它将消除错误。

文档: https://docs.microsoft.com/en-us/powershell/module/sqlserver/invoke-sqlcmd?view=sqlserver-ps

答案 2 :(得分:0)

当查询结果集中的列名重复时,会出现此错误。 invoke-sqlcmd:SQL PowerShell中不允许重复的列名

假设您使用下面的查询来查看invoke-sqlcmd查询中的结果集-

选择测试,*来自测试表

现在,测试列将在结果中重复,并且调用sqlcmd执行将失败。

要解决此问题,例如: 选择test作为testColumn,*从testtable中选择