【问题标题】:Regex to replace stored procedure params with declarations正则表达式用声明替换存储过程参数
【发布时间】:2016-01-22 17:58:18
【问题描述】:

我经常不得不重写存储过程,因为我没有“正常”代码的执行权限——这意味着将存储过程参数重写为声明 + SET。

例如:

@pParam  VARCHAR(20),
@pPlant  VARCHAR(4) = NULL,
@pDateTimeFrom  VARCHAR(30) = NULL,
@pDateTimeTo  VARCHAR(30) = NULL,
@pLanguage  VARCHAR(2) = 'EN',
@pClass  NVARCHAR(MAX) = NULL,
@pFilterCompleteDate  BIT = NULL,
@user VARCHAR(50) = NULL,
@updateKey VARCHAR(50) = NULL,
@seqnoKey INT = NULL,
@comment VARCHAR(1000) = NULL,
@testID INT = NULL,
@info NVARCHAR(MAX) = NULL

使用正则表达式查找和替换我想要这种格式:

DECLARE @pParam VARCHAR(20) 
SET @pParam = 
DECLARE @pPlant VARCHAR(4) 
SET @pPlant = NULL
DECLARE @pDateTimeFrom VARCHAR(30) 
SET @pDateTimeFrom = NULL
DECLARE @pDateTimeTo VARCHAR(30) 
SET @pDateTimeTo = NULL
DECLARE @pLanguage VARCHAR(2) 
SET @pLanguage = 'EN'
DECLARE @pClass NVARCHAR(MAX) 
SET @pClass = NULL
DECLARE @pFilterCompleteDate BIT 
SET @pFilterCompleteDate = NULL
DECLARE @user VARCHAR(50) 
SET @user = NULL
DECLARE @updateKey VARCHAR(50) 
SET @updateKey = NULL
DECLARE @seqnoKey INT 
SET @seqnoKey = NULL
DECLARE @comment VARCHAR(1000) 
SET @comment = NULL
DECLARE @testID INT 
SET @testID = NULL
DECLARE @info NVARCHAR(MAX) 
SET @info = NULL

我想出了这个正则表达式

查找:

(@.+?)\b\s+\b(.*?)(\s=\s(.*),?|,)

替换:

DECLARE \1 \2 \r\nSET \1 = \4

但第 4 个捕获组在字符串末尾包含 ,。当我将它包含在正则表达式中时,它没有得到没有值的第一行和没有逗号的最后一行。

你能帮我找到一个正则表达式,它可以正确找到所有声明(无值、值、无逗号)。谢谢!

【问题讨论】:

标签: regex tsql sql-server-2005


【解决方案1】:

你可以使用

(@\S+)\s+\b([^=\n]*?)(\s*=\s*(.*?))?,?(?=$|\r?\n)

并替换为DECLARE \1 \2 \r\nSET \1 = \4

regex demo 输出:

DECLARE @pParam VARCHAR(20) 
SET @pParam = 
DECLARE @pPlant VARCHAR(4) 
SET @pPlant = NULL
DECLARE @pDateTimeFrom VARCHAR(30) 
SET @pDateTimeFrom = NULL
DECLARE @pDateTimeTo VARCHAR(30) 
SET @pDateTimeTo = NULL
DECLARE @pLanguage VARCHAR(2) 
SET @pLanguage = 'EN'
DECLARE @pClass NVARCHAR(MAX) 
SET @pClass = NULL
DECLARE @pFilterCompleteDate BIT 
SET @pFilterCompleteDate = NULL
DECLARE @user VARCHAR(50) 
SET @user = NULL
DECLARE @updateKey VARCHAR(50) 
SET @updateKey = NULL
DECLARE @seqnoKey INT 
SET @seqnoKey = NULL
DECLARE @comment VARCHAR(1000) 
SET @comment = NULL
DECLARE @testID INT 
SET @testID = NULL
DECLARE @info NVARCHAR(MAX) 
SET @info = NULL

【讨论】:

  • 优秀,按预期工作。如果有人尝试发布不同的解决方案然后接受,我将等待几天。
猜你喜欢
  • 2014-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-24
  • 2011-09-15
  • 1970-01-01
  • 2020-11-05
  • 2014-03-29
相关资源
最近更新 更多