2017-10-20 70 views
0
此命令工作

我有以下SQL命令讀取我的數據庫的索引碎片稱爲Logik爲什麼在SQL Server Management Studio,但不能從PowerShell的

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中,這個工程沒有一個問題,並返回與他們的fragementation表。

昨天,這也從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 
+0

使用應遵循GO - 確乎上下文切換; – revoua

+1

@revoua no。 USE是僅由SSMS和sqlcmd理解的*批處理*命令。這不是一個T-SQL命令 –

+2

@SimonS不應該使用@SimonS。首先連接到你想要的數據庫。 'USE'是SSMS或sqlcmd可以理解的批處理命令,它不是T-SQL命令。 –

回答

1

USE不應該在所有使用。這是一個由SSMS或sqlcmd理解的批處理命令,不是T-SQL命令。

在這種情況下,連接字符串已經連接到Logik數據庫。沒有理由使用USE切換到它。

只需使用:

$command = " 
SELECT OBJECT_NAME(ind.OBJECT_ID) AS TableName, 
ind.name AS IndexName, indexstats.index_type_desc AS IndexType, 
... 

如果你想使用不同的數據庫表中同一查詢,使用三部分名稱,例如:MyDatabase.dbo.ThatTableName

您應該可能而不是在Powershell腳本中使用ADO.NET庫。 Powershell不會抱怨,如果你拼錯變量名稱,它會創建一個新的空的名稱。

改爲使用SQL Server Powershell provider。這樣,你可以寫下面的代碼:

Import-Module Sqlps -DisableNameChecking; 
cd SQL\MyRemoteServer\DEFAULT\Databases\MyDatabase 
$result=Invoke-SqlCmd -Query "SELECT @@VERSION;" 

$result變量將舉行查詢後的結果。

如果查詢返回multile行,或者甚至包含多個行的單個行,那麼您將返回一個具有與列匹配的屬性的對象數組。

下面的查詢:

$tables=Invoke-SqlCmd -Query "SELECT * from sys.tables" 

將返回sys.tables表的內容。您可以將各個列作爲屬性進行訪問。該腳本將返回所有的表名:

$tables | %{ $_.name;} 

鏈接在一起:

Invoke-SqlCmd -Query "SELECT * from sys.tables" | % {$_.name} 
+0

謝謝,儘管我的腳本沒有運氣。奇怪的是,'$ tables'沒有輸出。但如果我使用'$ tables.count',它會返回'8'。奇怪的 – SimonS

+0

沒有人可以幫助,如果你沒有提到什麼是錯的,至少一個錯誤信息。順便說一句,你爲什麼使用ADO.NET類而不是SQL Server Powershell cmdlet? PowerShell不會抱怨,如果你拼錯一個變量,它會創建一個*新的空*錯誤的名稱 –

+0

我解釋我的問題很清楚的問題。我不使用sqlserver cmdlet,因爲我不在SQL服務器本身。 – SimonS

相關問題