Sql server 如何从csv文件创建sql表?

Sql server 如何从csv文件创建sql表?,sql-server,powershell-5.0,Sql Server,Powershell 5.0,给定一个.csv文件,Fact.csv,假设它有7列 最终目标是实现以下目标: script.ps1 Fact.csv 3 4 其中前3列肯定是varchar类型,而其余的列(4)是real类型 如何循环通过.csv文件的标题(可以包含数据,但我们不想导入数据,只想导入表列名的标题),并动态创建表(.csv文件的名称,例如事实)以及表列,是否使用上面数据库中的数字指定的列类型 伪代码: $csvfile = .\Fact.csv $csv = Import-CSV $csvFile $csv

给定一个
.csv
文件,
Fact.csv
,假设它有7列

最终目标是实现以下目标:

script.ps1 Fact.csv 3 4 
其中前3列肯定是
varchar
类型,而其余的列(4)是
real
类型

如何循环通过
.csv
文件的标题(可以包含数据,但我们不想导入数据,只想导入表列名的标题),并动态创建表(
.csv
文件的名称,例如
事实
)以及表列,是否使用上面数据库中的数字指定的列类型

伪代码:

$csvfile = .\Fact.csv
$csv = Import-CSV $csvFile
$csvHeaders = ($csv | Get-Member -MemberType NoteProperty).name

Function Query($Query) {
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection 
$SqlConnection.ConnectionString = "Server=$Server;Initial Catalog=$Database;Integrated Security=SSPI" 
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand 
$SqlCmd.Connection = $SqlConnection 
$SqlCmd.CommandText = $Query 
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter 
$SqlAdapter.SelectCommand = $SqlCmd 
$DataSet = New-Object System.Data.DataSet 
$a=$SqlAdapter.Fill($DataSet)
$SqlConnection.Close() 
$DataSet.Tables[0] }

foreach ($column in $csvHeaders | where 1st $x columns = varchar and remaining columns = real) {
Query "CREATE TABLE [dbo].[$csvfile.name](
    [column1] [varchar](100) NOT NULL,
    [column2] [varchar](100) NOT NULL,
    [column3] [varchar](100) NOT NULL,
    [column4] [real] NULL,
    [column5] [real] NULL,
    [column6] [real] NULL,
    [column7] [real] NULL
) ON [PRIMARY]"

}
$csvfile = .\Fact.csv
$csv = Import-CSV $csvFile
$csvHeaders = ($csv | Get-Member -MemberType NoteProperty).name

$query="CREATE TABLE [dbo].[$csvfile.name]( "
$index=1
foreach ($column in $csvHeaders) {
  $query=$query+"[$column] "
  if($index -gt $varcharendposition) {$query=$query+"real, "} else {$query=$query+"varchar(50), "}  
  $index++
}
$query=$query + ") "

Query $query

更好的是,如果有办法告诉Powershell,只有前x个列是
varchar
,而其余的是
real
,,我们就不必指定4,这不是一个完整的答案,只是一个指导,显示了一个可能有语法错误的不雅暴力方法。有PS枪,可能可以减少到三行

扩展伪代码:

$csvfile = .\Fact.csv
$csv = Import-CSV $csvFile
$csvHeaders = ($csv | Get-Member -MemberType NoteProperty).name

Function Query($Query) {
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection 
$SqlConnection.ConnectionString = "Server=$Server;Initial Catalog=$Database;Integrated Security=SSPI" 
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand 
$SqlCmd.Connection = $SqlConnection 
$SqlCmd.CommandText = $Query 
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter 
$SqlAdapter.SelectCommand = $SqlCmd 
$DataSet = New-Object System.Data.DataSet 
$a=$SqlAdapter.Fill($DataSet)
$SqlConnection.Close() 
$DataSet.Tables[0] }

foreach ($column in $csvHeaders | where 1st $x columns = varchar and remaining columns = real) {
Query "CREATE TABLE [dbo].[$csvfile.name](
    [column1] [varchar](100) NOT NULL,
    [column2] [varchar](100) NOT NULL,
    [column3] [varchar](100) NOT NULL,
    [column4] [real] NULL,
    [column5] [real] NULL,
    [column6] [real] NULL,
    [column7] [real] NULL
) ON [PRIMARY]"

}
$csvfile = .\Fact.csv
$csv = Import-CSV $csvFile
$csvHeaders = ($csv | Get-Member -MemberType NoteProperty).name

$query="CREATE TABLE [dbo].[$csvfile.name]( "
$index=1
foreach ($column in $csvHeaders) {
  $query=$query+"[$column] "
  if($index -gt $varcharendposition) {$query=$query+"real, "} else {$query=$query+"varchar(50), "}  
  $index++
}
$query=$query + ") "

Query $query

这将充满错误,但请尝试并在出现错误时排除每个错误或bug。然后你可以发布你的答案并接受它。

你的伪代码是一个很好的开始。您认为如何将列列表放入一个可以迭代的列表中,以便
foreach
能够正常工作?@Nick.McDermaid类似于$csv=Import csv$csvFile$csvHeaders=($csv | Get Member-MemberType NoteProperty).name;foreach($csvHeaders中的header){…等..}这样就得到了头,这很简单,但是如何动态地指定“对于第一个$x列,创建表列作为varchar类型,对于其余的,创建实类型。”@Nick.McDermaid我用标题列表编辑了我的帖子。我个人会使用
foreach
中的计数器来决定每次迭代应该发出哪种数据类型。也许有一个更聪明的方法。@Nick.McDermaid ya现在我想找到一个好方法已经没有希望了,哈哈。我正在查找c代码,因为可以通过powershell运行c代码……我确实找不到任何使用powershell在线从文件创建表的示例……不过我确实找到了使用c代码的示例,但它们只有1个预定义的数据类型,这与我的需求不同,我的需求至少有2个数据类型:/我最终使用了Smo对象,这要归功于本文: