让我们假设,我有以下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对象创建一个提供名称(空或已填充)的新表?
答案 0 :(得分:3)
我创建了一个名为add-sqltable的函数,该函数将数据表作为输入并使用SMO创建SQL Server表。
此功能可在PoshCode和Scripting 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
可以做同样的事情。