2011-02-14 81 views
0

讓我們假設,我有以下PowerShell代碼:如何從system.Data.datatable對象創建數據庫表?

$connectionstring = "... some connection ..." 
$sql = "Select * from Sometable" 
$tablename= 'Copy_of_Sometable' 

$cmd = New-Object system.Data.OleDb.OleDbCommand($sql,$connectionstring) 
$da = New-Object system.Data.OleDb.OleDbDataAdapter($cmd) 
$dt = New-Object system.Data.datatable 
[void]$da.fill($dt) 

我知道,我可以得到從$一個創建表腳本dt和使用它來創建一個新表與給定的名稱比照for example

但是,有沒有更直接的方式來創建一個新的表與一個提供的名稱(空或已填充)從數據表對象?

回答

1

根據驅動程序的功能,你可以用相同的一條SQL語句成功:

「SELECT * INTO newtable的FROM oldtable」

使用ODBC和Jet表甚至有可能在(關鍵字)不同數據庫。


因爲我真的很喜歡 「INSERT/SELECT INTO IN」 命令(S)和以前從未使用PowerShell的數據庫 '工作':

(Edited) Powershell session: 

    PS C:\Documents and Settings\eh\My Documents\WindowsPowerShell> 
    $CS="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=<SOMEWHERE>\Nwind.mdb" 
    $SQL="SELECT * INTO CusCopy FROM Customers" 
    $cmd = New-Object system.Data.OleDb.OleDbCommand($SQL,$CS) 
    $cmd.Connection.Open() 
    $cmd.ExecuteNonQuery() 
    91 

Please take the "91" as evidence that the command affected==inserted the 91 
customers from the original table to the copy. 

    $SQL="SELECT * INTO [customer.csv] IN '' 'text;HDR=YES;Database=<SOMEWHERE>' FROM Customers" 
    $cmd = New-Object system.Data.OleDb.OleDbCommand($SQL,$CS) 
    $cmd.Connection.Open() 
    $cmd.ExecuteNonQuery() 
    91 
    dir 
    Directory: <SOMEWHERE> 
    Mode    LastWriteTime  Length Name 
    ----    -------------  ------ ---- 
    -a---  14.02.2011  22:09  13395 customer.csv 
    -a---  14.02.2011  22:01 2576384 Nwind.mdb 
    -a---  14.02.2011  22:09  394 schema.ini 

A table .csv and a schema.ini (entry) were newly/dutifully created. 
1

使用System.Data.Datatable你幾乎必須使用所描述的方法。

但是,如果您使用的是SQL 2008,則可以使用更直接的方法。Invoke-SqlCmd cmdlet可讓您按照Ekkehard.Horner的建議SELECT * INTO newtable FROM oldtable執行操作。 (不幸的是複製品不支持)

當然,system.Data.OleDb.OleDbCommand的工作原理是相同的。