我正在通过Powershell Get-Content 阅读SQL脚本(DDL / DML)。这被分配给一个变量。现在我需要将该脚本中的某些内容替换为我的内容。 示例:
脚本:
**CREATE TABLE [dbo].[MyTable]** (
[MyTableID] INT NOT NULL,
[MyTableRecalculated] BIT NULL,
PRIMARY KEY CLUSTERED ([MyTableID] ASC) ON [PRIMARY]
) ON [PRIMARY];
将“CREATE TABLE [dbo]”替换为:
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'MyTable')
DROP TABLE [dbo].[MyTable]
--GO
**CREATE TABLE [dbo].[MyTable]** (
遇到问题:
CREATE TABLE [dbo]。[MyTable] 可能有多个空格限制我在powershell中使用-replace进行替换,因为它会寻找精确的字符串匹配。
我的代码:
$tempDeltaelement = $Deltaelement -replace 'CREATE TABLE \[dbo\]\.\[([^\]]+)\]', $createwrapperBlock
Where,
$Deltaelement = SQL DML/DDL script read and assigned.
$createwrapperBlock = $createwrapperBlock = @'
PRINT N'Creating [dbo].[$1]...';
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'$1')
DROP TABLE [dbo].[$1]
CREATE TABLE [dbo].[$1]
'@
答案 0 :(得分:0)
以下代码应该可以使用
$sql = @"
CREATE TABLE [dbo].[MyTable] (
[MyTableID] INT NOT NULL,
[MyTableRecalculated] BIT NULL,
PRIMARY KEY CLUSTERED ([MyTableID] ASC) ON [PRIMARY]
) ON [PRIMARY];
"@
$sqlDropCreate = @"
IF OBJECT_ID('{0}.{1}') IS NOT NULL
DROP TABLE {0}.{1};
CREATE TABLE {0}.{1}
"@
$options = [System.Text.RegularExpressions.RegexOptions]::SingleLine
$capture = [RegEx]::Matches($sql, '\s*CREATE\s*TABLE\s*(\[*\w+\]*)\.(\[*\w+\]*)(.*)', $options)
$schema = $capture.Groups[1].Value
$table = $capture.Groups[2].Value
$rest = $capture.Groups[3].Value
$newStart = $sqlDropCreate -f $schema, $table
$newSql = "$newStart$rest"
cls;$newSql
正则表达式将CREATE TABLE [dbo].[MyTable]
与CREATE,TABLE和schema.tablename(\ s * sections)之间的任意数量的空格进行匹配。正则表达式也适用于括号内或非括号内的对象名称,但不检查括号是否在两侧 - 如果它们在那里则包含它们。