Powershell读取表名并将其用于一行

时间:2016-08-23 08:06:14

标签: powershell

您好我是PowerShell的新手,我有一个脚本可以从sql文件中读取所有CREATE TABLES。在这些CREATE TABLES语句之前,我必须打印一个IF EXIST语句,其中包含CREATE TABLE语句的表名

2 个答案:

答案 0 :(得分:1)

只需使用正则表达式替换,如下所示:

$x = Get-Content my_file.sql -raw
$r = @'
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'$1')
    DROP TABLE [dbo].[$1]
    --GO

    CREATE TABLE [dbo].[$1]
'@
$x -replace 'CREATE TABLE \[dbo\]\.\[([^\]]+)\]', $r

答案 1 :(得分:0)

如果$SqlStatements是一个包含内容的变量,那么这就可以了。

$ifExists = @'
    IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'{0}')
    DROP TABLE {1}
    --GO
'@

[Regex]::Matches($SqlStatements, '\s*CREATE TABLE (\S+\.\[(\S+)\])') | Sort-Object Index -Descending | ForEach-Object {
    $SqlStatements = $SqlStatements.Insert(
        $_.Index,
        "`r`n" + ($ifExists -f $_.Groups[2].Value, $_.Groups[1].Value) + "`r`n"
    )
}
$SqlStatements

从结束跟踪向后进行替换。尝试前进将在第一次插入后使索引值无效。