web-dev-qa-db-ja.com

Powershellでのスクリプトテーブルの定義

パーティションの切り替え*を目的として、(別のスキーマに)重複するテーブルを作成するPowerShellを作成しています。列とクラスター化列ストアインデックスの追加に問題があります。

これが私がこれまでに持っているものです($ schemaNameは宛先スキーマです)。

<snip for parameters getting passed in>

$database = $server.Databases[$dbName]

$table = new-object Microsoft.SqlServer.Management.Smo.Table ($database, $tblName)

$table.Schema = $schemaName

# Next two lines are not working
foreach ($col in $tblname.columns) { $table.columns.Add($col) }
# $table.Columns.CopyTo($tblName.Columns, 0)

## NEED TO ADD CLUSTERED COLUMN STORE INDEX TO TABLE

Write-Output $table.Columns.Count # Getting zero column count
# This isn't working
# $table.Create()

列/クラスター化列ストアインデックスを追加する方法についてのアイデアはありますか?またはより良いアプローチ?

  • = PartitionManagerは、codeplex上で、SQL Server 2014(クラスター化された列ストアインデックス)をサポートしていないため、独自のコードをロールする必要があります。

タイトルを編集

2
Chris L

通常、PowershellがT-SQLを実行している場合でも、T-SQLを使用してこのようなことを行います。

SELECT *
INTO dbo.copyTable
FROM dbo.originalTable
WHERE 1 = 2
GO

CREATE CLUSTERED COLUMNSTORE INDEX _CS ON dbo.copyTable
GO

ただし、次のPowershellを簡単な例として機能させることができました。

$instance = ".\sql2014"
$server = New-Object "Microsoft.SqlServer.Management.Smo.Server" $instance
$database = $server.Databases[$dbName]

$tblName = "cs_test"
$originalTable = $database.Tables[$tblName]

$newTable = New-Object ("Microsoft.SqlServer.Management.Smo.Table") ($database, "copyTable", "dbo")


# Loop through columns adding each one to new table
foreach ($col in $originalTable.Columns)
{
    $newCol = New-Object ("Microsoft.SqlServer.Management.Smo.Column") ($newTable, $col.Name, $col.DataType)
    $newCol.Nullable = $col.Nullable
    $newTable.Columns.Add($newCol)
}


# Add columnstore index
$idx = New-Object ("Microsoft.SqlServer.Management.Smo.Index")($newTable, "idx") ##,IndexType.ClusteredColumnStoreIndex)
$idx.IndexType = "ClusteredColumnStoreIndex"
$newTable.Indexes.Add($idx)

# Create the table
$newTable.Create()
2
wBob