sql-server - 如何编写一个循环来读取文本文件并将其插入数据库

标签 sql-server loops powershell

我正在编写一个 powershell 脚本来将特定文件夹中的文本文件加载到 SQL Server 数据库中,我设法做到了,但只有一个文件接一个文件。我希望程序在用户输入路径和文件扩展名后自动执行此操作。

例如:

在 C:\Test 路径下,我有:

  1. 测试1.txt
  2. 测试2.txt
  3. Test3.txt
  4. Abcd.txt

我想让程序循环遍历文件并自动将其插入数据库。文件夹中的文件数量可以从10个文件到数百个文件不等,每个文件的列数不固定

到目前为止我做了什么:

  1. 在 SQL Server 中创建了一个存储过程以根据文件名创建一个新表并通过我的 powershell 脚本调用它。

  2. 编写了需要用户输入路径、文件名和扩展名(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"

最佳答案

要添加一个简单的循环,您可以像这样使用现有的 AutoImportFlatFiles 函数:

$Folder= $(read-host "Folder Location ('C:\Test\' okay)")
foreach ($file in (get-childitem $Folder)) {
    $location = split-path $file.FullName -Parent
    $filename = (split-path $file.FullName -Leaf).split(".")[0]
    $extension = (split-path $file.FullName -Leaf).split(".")[1]

    AutoImportFlatFiles -location $location -file $filename -extension $extension -server "WIN123" -database "DB_DISCOVERY"
}

关于sql-server - 如何编写一个循环来读取文本文件并将其插入数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30857782/

相关文章:

linux - 循环带有扩展名的文件不起作用

javascript - 了解 JS 引擎如何循环获取数组元素的索引

azure - 如何从 Azure 命令 "results"的 'az group list in powershell' 数组中只选择一个属性?

sql-server - Weka如何连接到MSSQL服务器

sql - SSIS 序列容器事务选项

SQL查询以获取字符串中任何位置包含a和b的名称

sql - 更新为 NULL 的列

C++忽略数组中的相同数字

powershell - 如何在 V2 中模拟 PowerShell V3 属性

powershell - 根据版本号和一些条件比较文件并格式化输出