如何从system.Data.datatable对象创建数据库表?

时间:2011-02-14 19:51:25

标签: sql-server powershell

让我们假设,我有以下PowerShell代码:

$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派生出一个创建表脚本,并用它来创建一个给定名称为cf的新表。 for example

但是有没有更直接的方法从datatable对象创建一个提供名称(空或已填充)的新表?

3 个答案:

答案 0 :(得分:3)

我创建了一个名为add-sqltable的函数,该函数将数据表作为输入并使用SMO创建SQL Server表。

此功能可在PoshCodeScripting Guy Script Repository上使用。我在博客上发表了Scripting Guy guest post

答案 1 :(得分:1)

根据驱动程序的功能,您可以使用以下单个SQL语句成功:

“SELECT * INTO newtable FROM oldtable”

使用ODBC和Jet,表甚至可能是IN(关键字)不同的数据库。


因为我非常喜欢“INSERT / SELECT INTO IN”命令,而且之前从未使用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.

答案 2 :(得分:1)

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

但是,如果您使用的是SQL 2008,则可以使用更直接的方法。Invoke-SqlCmd cmdlet可以让您按照Ekkehard.Horner的建议SELECT * INTO newtable FROM oldtable进行操作。 (遗憾的是,不支持复制项目)

当然system.Data.OleDb.OleDbCommand可以做同样的事情。