Powershell将变量传递给具有SQL查询循环和IN子句的函数

问题描述

我想做的是将$ sContractNumbers变量传递给我下面的循环,该循环基本上根据SQL查询将两个csv文件组合在一起。

我正在使用以下代码块从excel电子表格中获取值。某些内容将由其他用户更新。该单元格将始终是静态的,但是该单元格中的数据将更改大小,因此我必须使用IN子句。

我的变量值看起来像这样。

$ sContractNumbers ='abc123','abc456','abc789','abc112','abc345'


    $xl = New-Object -COM "Excel.Application"
    $xl.Visible = $true
    $wb = $xl.Workbooks.Open("C:\Dev\Blah\ManualContracts.xlsx")
    $ws = $wb.Sheets.Item(1)
    #Looking up a value in one column and assigning the corresponding value from another column to a variable Could be done like this:
    
    for ($i = 0; $i -le 1; $i++) {
      if ( $ws.Cells.Item(1,2).Text -eq $ColumnHeader ) {
        $i = $i++;
        $sContractNumbers = $ws.Cells.Item(2,2).Value
        #$sContractNumber
        break
      }
    }
    
    $wb.Close()
    $xl.Quit()
    [System.Runtime.Interopservices.Marshal]::ReleaseComObject($xl)
    
    $sContractNumbers

添加此片段之前,我只是在两个查询中复制并粘贴了合同列表。

当前出现的错误如下。我不认为该循环会影响该变量。我尝试使用AddWithValue,但我认为我没有正确放置它,因此未列出它。对Powershell来说还很新,但是对T-sql有所了解。我认为这是一个简单的问题,但是由于我是菜鸟,所以我无法完全理解需要纠正的内容。保持温柔...

    $DetailContent[1] = "{0}`r`n{1}" -f $HeadeDetail,$DetailContent[1]
         |  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         | Cannot index into a null array.


    Function Run-Query
    {
        param([string[]]$queries,[string[]]$sheetnames)
        Begin
        {
            $sqlServer = 'server'
            $Database = 'warehouse'
            $sqlConnection = New-Object System.Data.sqlClient.sqlConnection
            $sqlConnection.ConnectionString = "Server = $sqlServer; Database = $Database; Integrated Security = True"
            $FileNameDate = Get-Date -f 'yyyyMMdd'
        }#End Begin
        Process
        {
            # Loop through each query
            For($i = 0; $i -lt $queries.count; $i++)
            {
                $sqlCmd = New-Object System.Data.sqlClient.sqlCommand
                $sqlCmd.CommandText = $queries[$i]
                $sqlCmd.Connection = $sqlConnection
                $sqlAdapter = New-Object System.Data.sqlClient.sqlDataAdapter
                $sqlAdapter.SelectCommand = $sqlCmd
                $DataSet = New-Object System.Data.DataSet
                $sqlAdapter.Fill($DataSet)
                $DataSet.Tables[0] | Export-CSV -NoTypeinformation -Path "C:\Dev\blah\HeaderDetail\$($sheetnames[$i])_$FileNameDate-000.csv" -Delimiter '|'
                
            }
        }#End Process
        End
        {
            $sqlConnection.Close()
        }
    }#End function run-query.
    
    $queries = @()
    
    $queries += @'
    SET NOCOUNT ON
    SET ANSI_WARNINGS OFF
    /*FE Header*/
      SELECT [sContractNumber] as ContractNumber,into #Temp
      FROM  C
      INNER JOIN  D ON C.Id=D.iId
      WHERE c.sContractNumber in ('$sContractNumbers')
      order by sContractNumber
    
    declare @TotalNewContracts int = 0
    declare @TotalCanContracts int = 0
    declare @TotalExpcontracts int = 0
    
    set @TotalNewContracts = (select COUNT(fe.ContractNumber) from #temp fe where Record_Type = 'P')
    set @TotalCanContracts = (select COUNT(fe.ContractNumber) from #temp fe where Record_Type = 'C')
    
    select
    count(contractnumber) as 'Total Number of All Contracts',FROM #temp ;
    
    drop table #Temp;
    '@
    
    $queries += @'
    SET NOCOUNT ON
    SET ANSI_WARNINGS OFF
    
    /*FE Header*/
      SELECT [sContractNumber] as ContractNumber,into #Table
      FROM [pcmi_warranty_custom_twsi].[dbo].[Contract_Header] C
      INNER JOIN [pcmi_warranty_custom_twsi].[dbo].[Dealer_Header] D ON C.iDealerId=D.iId
      WHERE c.sContractNumber in ('$sContractNumbers')
      order by sContractNumber
    
    SELECT ContractNumber,FROM #temp FE;
    
    drop table #Temp;
    '@
    
    $sheetnames = @()
    $sheetnames += 'Header'
    $sheetnames += 'Details'
    
    #FileName
    $FileNameDate = Get-Date -f 'yyyyMMdd'
    Run-Query -queries $queries -sheetnames $sheetnames
    #Removes Double Quotes from File
    (Get-Content C:\Dev\blah\HeaderDetail\Header_$FileNameDate-000.csv) | % {$_ -replace '"',''} | out-file -FilePath C:\Dev\blah\Header\Header_$FileNameDate-000.csv -Force -Encoding ascii
    (Get-Content C:\Dev\blah\HeaderDetail\Details_$FileNameDate-000.csv) | % {$_ -replace '"',''} | out-file -FilePath C:\Dev\blah\Detail\Details_$FileNameDate-000.csv -Force -Encoding ascii
    #Add Double Pipes as Delimter
    (Get-Content C:\Dev\blah\Header\Header_$FileNameDate-000.csv) | % {$_ -replace "\|","||"} | out-file -FilePath C:\Dev\blah\Header\Header_$FileNameDate-000.csv -Force -Encoding ascii
    (Get-Content C:\Dev\blah\Detail\Details_$FileNameDate-000.csv) | % {$_ -replace "\|","||"} | out-file -FilePath C:\Dev\blah\Detail\Details_$FileNameDate-000.csv -Force -Encoding ascii
    #Add Header Detail Row to Detail File
    #Header Path
    $HeaderPath = "C:\Dev\blah\Header\Header_$FileNameDate-000.csv"
    #Detail Path
    $DetailsPath = "C:\Dev\blah\Detail\Details_$FileNameDate-000.csv"
    #Gets second row of header file and sets it as a varaible
    $HeadeDetail = Get-Content $HeaderPath -TotalCount 2 | Select-Object -Last 1;
    #print the header detail row
    $HeadeDetail
    #Get Detail File content
    $DetailContent = Get-Content -Path $DetailsPath
    #Add Header Detail row to Detail file
    $DetailContent[1] = "{0}`r`n{1}" -f $HeadeDetail,$DetailContent[1] 
    #Save Detail File
    $DetailContent | Set-Content "C:\Dev\blah\blah$FileNameDate-000.csv" -Force -Encoding ascii
    #Set the file name
    $SourceFile = "C:\Dev\blah\blah$FileNameDate-000.csv"
    $DestinationFolder = 'C:\Dev\blah'
    $HeaderFile = "C:\Dev\blah\Header\Header_$FileNameDate-000.csv"
    $DetailFile = "C:\Dev\blah\Detail\Details_$FileNameDate-000.csv"
    $HDestinationFolder = 'C:\Dev\blah\Header'
    $DDestinationFolder = 'C:\Dev\blah\Detail'
    
    if (Test-Path $SourceFile)
    { 
        $latest = Get-ChildItem -Path $DestinationFolder| sort-object Name -Descending | Select-Object -First 1
        #split the latest filename,increment the number,then re-assemble new filename:
        $newFileName = $latest.BaseName.Split('-')[0] + "-" + ([int]$latest.BaseName.Split('-')[1] + 1).ToString().PadLeft(3,"0") + $latest.Extension
        Move-Item -path $SourceFile -destination $DestinationFolder"\"$newFileName
    }
    if (Test-Path $HeaderFile)
    { 
        $latest = Get-ChildItem -Path $HDestinationFolder| sort-object Name -Descending | Select-Object -First 1
        #split the latest filename,"0") + $latest.Extension
        Move-Item -path $HeaderFile -destination $HDestinationFolder"\"$newFileName
    }
    if (Test-Path $DetailFile)
    { 
        $latest = Get-ChildItem -Path $DDestinationFolder| sort-object Name -Descending | Select-Object -First 1
        #split the latest filename,"0") + $latest.Extension
        Move-Item -path $DetailFile -destination $DDestinationFolder"\"$newFileName
    }
    
    #Creates backup folder with corresponding date and places the file
    $FolderName = Get-Date -f 'MMdd'
    $FolderToCreate = "C:\Dev\blah\$FolderName"
    if (!(Test-Path $FolderToCreate -PathType Container)) {
        New-Item -ItemType Directory -Force -Path $FolderToCreate
    }
    copy-Item -Path "$DestinationFolder\TWFE*.csv" -Destination $FoldertoCreate -force; 
    
    $ODrive = 'O:\blah\blah\blah'
    $FolderTocopy = "O:\blah\blah\blah\$FolderName"
    $LatestFile = Get-ChildItem -Path "$DestinationFolder\$FolderName" -Name TWFE*.csv | sort-object -Descending | Select-Object -First 1
    if (!(Test-Path $FolderTocopy -PathType Container)) {
        copy-Item -Path "$DestinationFolder\$FolderName" -Destination $FolderTocopy -Recurse -Force -ErrorAction Continue
    }
    
    if ((Test-Path $FolderTocopy -PathType Container)) {
        copy-Item -Path $LatestFile -Destination $FolderTocopy -Recurse -Force -ErrorAction Continue
    }

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...