【问题标题】:How do I split file on batches using powershell如何使用powershell批量拆分文件
【发布时间】:2013-09-23 09:56:27
【问题描述】:

如何使用 powershell 批量拆分文件?

我有一个包含多个批次的 sql 部署后文件。下面是我的 postDeployment.sql 文件的示例。

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'StoredProc') AND type in (N'P', N'PC'))
BEGIN
    DROP PROCEDURE [dbo].[StoredProc]
END

** GO **

CREATE PROCEDURE [dbo].[StoredProc]
    @nodeId int = 0 

AS
BEGIN
    SET NOCOUNT ON;
END

**GO**

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'StoredProc') AND type in (N'P', N'PC'))
BEGIN
    DROP PROCEDURE [dbo].[StoredProc]
END

**GO**

CREATE PROCEDURE [dbo].[StoredProc]     
    @nodeId int = 0 
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
END

$_

我需要自己执行每个批次。突出显示的 ** GO ** 上的 Shile 拆分

我的 PS 命令如下(不能正常工作):

function GetSqlBatchesFromString($file)
{
    $buffer = new-object System.Text.StringBuilder
    switch -regex -file $file {

        "^\s*GO[\s\d]*$" 
            { 
               # $__ returns go
                $buffer.ToString(); 
                $buffer.Length = 0;
            }
        default 
            { 
            $temp = $buffer.AppendLine($_);
            } 
        }

    $buffer.ToString();
}

function ExecuteBatch($batch)
{
Write-Host "Batch part ==== start"
Write-Host $batch
Write-Host "Batch part ==== end"   
}

 GetSqlBatchesFromString "D:\PostDeployment.sql" | % { ExecuteBatch $__}

【问题讨论】:

标签: sql powershell


【解决方案1】:

这个:

$a = ( [system.io.file]::ReadAllText( "c:\file.sql" ) -split '(?:\bGO\b)' ) | 
% { $_ + "`r`nGO" }

创建一个批量数组然后你可以尝试:

$a | % { ExecuteBatch $__}

【讨论】:

  • 我已经把这个放到我的脚本里了,但是我没有得到任何结果
  • 刚刚注意到我一直在运行旧版本的 powershell.. 现在我在 3 希望该命令仍然有效
  • 嘿,我们如何避免拆分单引号中的 GO 文本?我有一个类似的问题,我想测试这是否适用于具有类似 SELECT 'Testing GO if this get split' 的内容的 SQL 文件; GO SELECT 'Normal' 并注意到这将上述内容拆分为“SELECT 'Testing”作为一批和“如果这被拆分”;作为下一批和第三批作为“选择'正常'”@cpoDesign
【解决方案2】:

我找到了解决方案,但它并没有涵盖所有情况,例如 sql 内部的 GO:

$file = "D:\PostDeployment.sql"

  $SQLCommandText = @(Get-Content -Path $file) # loads content
    foreach($SQLString in  $SQLCommandText) 
    { 

        if($SQLString -ne "go") # if string is not equal to go then add it to existing string
        { 
            #Preparation of SQL packet 
            $SQLPacket += $SQLString + "`n" 
        } 
        else 
        { 
            Write-Host "---------------------------------------------" 
            Write-Host "Executed SQL packet:" 
            Write-Host $SQLPacket 

            $SQLPacket = ""  # clear up sql string
        } 
    } 

【讨论】:

    【解决方案3】:
    function Get-SqlBatchesFromFile {
        param($file)
    
        $accumulate = @()
    
        foreach($line in (get-content $file)){
            if($line -match "^\*\*\s?GO") {        
                $accumulate -join "`r`n"
                $accumulate = @()
            } else {
                $accumulate+=$line
            }
        }
    }
    
    filter Invoke-ExecuteBatch {
        Write-Host "Batch part ==== start"
        Write-Host $_
        Write-Host "Batch part ==== end"   
    }
    
    Get-SqlBatchesFromString  C:\temp\test.sql | Invoke-ExecuteBatch
    

    【讨论】:

    • @() 是创建空数组的方式
    猜你喜欢
    • 2010-11-03
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 2020-11-17
    • 1970-01-01
    • 2017-09-17
    • 2016-01-31
    • 2021-08-31
    相关资源
    最近更新 更多