代码之家  ›  专栏  ›  技术社区  ›  akaya_1992

如何通过发布管道将CSV文件从Azure Repo插入Azure SQL数据库?

  •  0
  • akaya_1992  · 技术社区  · 10 月前

    我正在尝试发布一个当前存储在Azure Repo中的csv文件,并希望通过发布管道将csv内容插入Azure SQL数据库。从技术上讲,这可行吗?当我不断遇到“操作系统错误代码997(重叠的I/O操作正在进行中。)”错误时。

    CSV数据示例:

    "True", "123,234325", "abc"
    

    以下是我使用的脚本:

    Bulk Insert TargetTableName
    from 'ArtifactAlias\foldername\filename.csv'
    with
    (
        FIRSTROW = 2,
        FIELDTERMINATOR = ',', 
        ROWTERMINATOR = '\n',
        FIELDQUOTE = '"'
    )
    
    0 回复  |  直到 10 月前
        1
  •  0
  •   Alvin Zhao - MSFT    10 月前

    更新

    根据您的补充和您可能的保护要求 , 可以在csv内容的每个字段中使用,我建议在代理作业期间运行下面的PowerShell脚本,以生成一个没有标头的新csv文件,其中包含您当前的分隔符( , )已更改为另一个( | 在我的情况下),这不会与字段中的数据冲突;它还将把导入的True/False字段更改为1/0。

    样品台

    CREATE TABLE [dbo].[SampleTable] (
        [IsTrueFalse] BIT NOT NULL,
        [Number] NVARCHAR(50) NOT NULL,
        [Remark] NVARCHAR(50) NOT NULL
    );
    

    sample.csv

    IsTrueFalse,Number,Remark
    "True", "123,234325", "abc"
    "False", "456,567890", "efg"
    

    noheaders.cv

    1| 123,234325| abc
    0| 456,567890| efg
    

    发布管道中使用的PowerShell脚本

    # Define file paths
    $inputFile = "$(System.DefaultWorkingDirectory)\_azuresql\sample.csv"
    $outputFile = "$(System.DefaultWorkingDirectory)\_azuresql\noheaders.csv"
    
    # Read the input file content
    $content = Get-Content $inputFile
    
    # Process each line: replace `",` with `|`, remove quotes, and convert "True"/"False" to 1/0
    $content | Select-Object -Skip 1 | ForEach-Object {
        # Replace `",` with `|` and then remove all remaining quotes
        $line = $_ -replace '",', '|' -replace '"', ''
       
        # Convert "True"/"False" to 1/0 for the IsTrueFalse column
        $fields = $line -split '\|'
        $fields[0] = if ($fields[0] -eq 'True') { '1' } elseif ($fields[0] -eq 'False') { '0' } else { $fields[0] }
        $fields -join '|'
    } | Set-Content $outputFile
    
    echo "Checking the contents of $outputFile..."
    Get-Content $outputFile
    
    echo "Checking bcp version..."
    bcp -v
    
    echo "Running bcp command..."
    bcp SampleTable in "$outputFile" -S $(AzureSQLServer) -d $(AzureSQLDB) -U $(AzureSQLServerAdmin) -P $(AzureSQLServerAdminPWD) -q -c -t "|"  # Pipe delimiter
    

    Image

    Image


    从表达式 FIRSTROW = 2 在您的SQL脚本中,我可以看到您的csv文件应该有第一行标题。为此,您可以在管道代理作业期间删除第一行并将预期内容输出到新文件中。以下是更新的PowerShell脚本供您参考。

    # Define file paths
    $inputFile = "$(System.DefaultWorkingDirectory)\_azuresql\test.csv"
    $outputFile = "$(System.DefaultWorkingDirectory)\_azuresql\noheaders.csv"
    
    # Read the input CSV file, skip the first line (header), and write the result to the output file
    Get-Content $inputFile | Select-Object -Skip 1 | Set-Content $outputFile
    
    echo "Checking bcp version..."
    bcp -v
    
    echo "Running bcp command..."
    bcp Users in "$outputFile" -S $(AzureSQLServer) -d $(AzureSQLDB) -U $(AzureSQLServerAdmin) -P $(AzureSQLServerAdminPWD) -q -c -t ","
    

    根据您的描述,您似乎需要在SQL上运行SQL脚本,而不是在管道代理计算机上运行,如本文所述 thread .

    根据这份关于如何 Load data from CSV file into a database (bcp) - Azure SQL | Microsoft Learn ,我们可以使用BCP工具将csv内容导入Azure SQL DB表。

    按照这个方向,我使用在 windows-latest Microsoft托管了代理,并设法导入了csv文件的内容。

    1. 我创建了一个表 Users 在Azure SQL数据库中进行测试; Image

    2. 添加了a test.csv 在我的仓库中创建一个文件,内容如下; Image

    3. 在发布管道中,将仓库添加为工件并运行PowerShell脚本;

      echo "Checking bcp version..."
      bcp -v
      
      echo "Running bcp command..."
      bcp Users in "$(System.DefaultWorkingDirectory)/_azuresql/test.csv" -S 
      $(AzureSQLServer) -d $(AzureSQLDB) -U $(AzureSQLServerAdmin) -P 
      $(AzureSQLServerAdminPWD) -q -c -t ","
      

      Image

    4. 发布成功后,我们可以检查表中的更新; enter image description here

      Image