Как создать таблицу sql из файла CSV? - PullRequest
0 голосов
/ 29 апреля 2020

Учитывая .csv файл, Fact.csv, который, скажем, имеет 7 столбцов

Конечная цель состоит в том, чтобы иметь что-то вроде этого:

script.ps1 Fact.csv 3 4 

, в котором первые 3 столбцы, безусловно, имеют тип varchar, в то время как остальные столбцы (4) имеют тип real.

Как мне l oop через заголовки файла .csv (который может содержать данные, но мы не хотим импортировать данные, только заголовки для имен столбцов таблицы), и динамически создать таблицу (имя файла .csv, например, Fact) вместе со столбцами таблицы, с типами столбцов, указанными выше числами в базе данных?

псевдокод:

$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]"

}

Более того, нам не нужно указывать 4, если есть способ сообщить Powershell, что только первое x количество столбцов равно varchar, а остальные real.

1 Ответ

1 голос
/ 29 апреля 2020

Это не полный ответ, а лишь руководство, показывающее неэлегичный метод грубой силы, который, вероятно, имеет синтаксические ошибки. Есть пушки PS, которые, вероятно, могут уменьшить это до трех строк.

Расширение вашего псевдокода:

$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

Это будет полно ошибок, но попробуйте и устраните каждую ошибку или ошибку, как т возникает. Затем вы можете опубликовать свой ответ и принять его.

...