【发布时间】:2018-04-01 14:55:02
【问题描述】:
我有以下 SQL 命令读取我的数据库的索引碎片,称为Logik:
USE Logik
SELECT
OBJECT_NAME(ind.OBJECT_ID) AS TableName,
ind.name AS IndexName, indexstats.index_type_desc AS IndexType,
indexstats.avg_fragmentation_in_percent
FROM
sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, NULL) indexstats
INNER JOIN
sys.indexes ind ON ind.object_id = indexstats.object_id
AND ind.index_id = indexstats.index_id
WHERE
indexstats.avg_fragmentation_in_percent > 0
在 SQL Server Management Studio 中,这没有问题,并返回带有碎片的表。
昨天,这也适用于 PowerShell。我没有更改任何代码,但今天它不再工作了。有谁知道为什么?
$Data 将保持为空:
param(
[string]$connectionstring = "Server=some\instance;uid=sa;pwd=dfdfdfdf;Database=Logik;Integrated Security=False;MultipleActiveResultSets=True;Connection Timeout=900;"
)
# Stop bei Fehler
$ErrorActionPreference = "SilentlyContinue"
$database = "logik"
# Database Connection herstellen
$con = New-Object System.Data.SqlClient.SqlConnection
$con.ConnectionString = $connectionstring
Try { $con.Open() }
Catch { Throw $_.Exception.Message }
# command einlesen um Fragmentation zu lesen
$command = "
USE Logik
SELECT OBJECT_NAME(ind.OBJECT_ID) AS TableName,
ind.name AS IndexName, indexstats.index_type_desc AS IndexType,
indexstats.avg_fragmentation_in_percent
FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, NULL) indexstats
INNER JOIN sys.indexes ind
ON ind.object_id = indexstats.object_id
AND ind.index_id = indexstats.index_id
WHERE indexstats.avg_fragmentation_in_percent > 0"
# Command Zusammensetzen
$cmd = New-Object System.Data.SqlClient.SqlCommand
$cmd.CommandText = $command
$cmd.Connection = $con
$cmd.CommandTimeout = 2000
# Execute Command
Try { $result = $cmd.ExecuteReader() }
Catch { Throw $_.Exception.Message }
# Output von Resultat
$Data = New-Object System.Data.DataTable
$Data.load($result)
整个事情很奇怪,因为我加载数据后,将其放入另一个变量$tables,并且我想在$tables为空时抛出。
我使用这段代码检查是否有任何数据加载,它为$tables返回一个空行,但$tables.count返回8。这怎么可能?
# Logik Tabellen
$tables = $Data | ? { $_.avg_fragmentation_in_percent -ge 5 -and $_.IndexName -ne 0 }
if (!$tables) { Throw "Keine Datenbank gefunden, oder keine Höher als 5% Fragmentation" }
$tables.count ; $tables ; pause
【问题讨论】:
-
USE 后面应该跟着 GO - 确实是切换上下文;
-
@revoua 没有。 USE 是一个 batch 命令,只有 SSMS 和 sqlcmd 才能理解。这不是 T-SQL 命令
-
@SimonS
USE根本不应该使用。首先连接到您想要的数据库。USE是SSMS或sqlcmd理解的批处理命令,不是T-SQL命令。 -
@PanagiotisKanavos 谢谢
-
@SimonS
still no luck不是错误消息。这次怎么了? 在 SSMS 中运行查询时是否有任何结果?确定没有错别字?
标签: sql-server powershell