【发布时间】:2015-06-16 02:15:16
【问题描述】:
我正在编写一个 powershell 脚本来将特定文件夹中的文本文件加载到 SQL Server 数据库中,我已经设法做到了,但只有一个文件一个文件。我希望程序在用户输入路径和文件扩展名后自动执行此操作。
例如:
在 C:\Test 路径下,我有:
- Test1.txt
- Test2.txt
- Test3.txt
- Abcd.txt
我想让程序循环遍历文件并将其自动插入数据库。文件夹中的文件数量可以从10个文件到100个文件不等,每个文件的列数不固定
到目前为止我做了什么:
在 SQL Server 中创建了一个存储过程,以根据文件名创建一个新表,并通过我的 powershell 脚本调用它。
编写了需要用户输入路径、文件名和扩展名(txt、csv 等)的 powershell 脚本,一旦捕获详细信息,它将在 SQL 服务器中创建一个表。
现在,我被困在循环过程中,因为我无法弄清楚如何让程序读取 Test1.txt 将其插入 SQL Server,然后继续读取 Test2.txt 将其插入 SQL Server,直到该特定文件夹中的文件末尾。
这是脚本:
Function AutoImportFlatFiles
(
$location = $(read-host "Folder Location ('C:\Test\' okay)"),
$file = $(read-host "File Name Without Extension ('Test1' okay)"),
$extension = $(read-host "File Extension ('.txt' okay)"),
$server,
$database
)
{
$full = $location + $file + $extension
$columns = Get-Content $full | Select -First 1
$columns = $columns.Replace(" ","")
$columns = $columns.Replace("|","] VARCHAR(2000), [")
$table = "CREATE TABLE " + $file + "([" + $columns + "] VARCHAR(2000))"
$connection = New-Object System.Data.SqlClient.SqlConnection
$buildTable = New-Object System.Data.SqlClient.SqlCommand
$insertData = New-Object System.Data.SqlClient.SqlCommand
$connection.ConnectionString = "Data Source=" + $server + ";Database=" + $database + ";integrated security=true"
$buildTable.CommandText = $table
$buildTable.Connection = $connection
## Added to function
$x = 0
$insertData.CommandText = "EXECUTE stp_BulkInsert @1,@2"
$insertData.Parameters.Add("@1", $full)
$insertData.Parameters.Add("@2", $file)
$insertData.Connection = $connection
$connection.Open()
$buildTable.ExecuteNonQuery()
$connection.Close()
## Added to function
$x = 1
if ($x = 1)
{
$connection.Open()
$insertData.ExecuteNonQuery()
$connection.Close()
}
}
AutoImportFlatFiles -server "WIN123" -database "DB_DISCOVERY"
【问题讨论】:
-
您希望用户手动输入每个文件名吗?
-
不,一旦用户键入路径,我希望脚本自动读取该特定路径中的所有文件。我现在这样做的方式是让用户一一输入我想要摆脱的东西。有关如何存档的任何建议?
标签: sql-server loops powershell