【问题标题】:Matching an exact string in a SQL.Replace function匹配 SQL.Replace 函数中的精确字符串
【发布时间】:2019-10-14 20:15:54
【问题描述】:

我有一个用于搜索 SQL 查询并将“CT.Item(i).ParameterName”替换为其实际值的 for 循环:

Dim SQLQP As String = SQL

For i=0 To CT.Count - 1
    SQL = SQL.Replace("CT.Item(i).ParameterName, "'" & CT.Item(i).Value & "'")

    SQLQP = SQLQP.Replace(CT.Item(i).ParameterName, "''' + " & CT.Item(i).ParameterName & " + '''")'.Replace("'%'", "''%''")
     End If
Next

'CT.Item(i).ParameterName' 是参数名称(例如:@p1、@p2、@p3 等) 问题是,如果有一个名为@p10 的参数名称,上面的循环将其视为“@p1”+“0”,因此当它更改@p1 时,它也会更改@p10,并留下一个 0。我怎样才能避免这个问题?

我在搜索时发现的其他解决方案要么不考虑标点符号,要么使用 REGEX,这在 SQL.replace 函数中不适用。

感谢您的帮助

编辑:我通过反转循环解决了“SQL”的问题。但是,现在我遇到了与“SQLQP”相同的问题:

else 语句

Else
   SQLQP = SQLQP.Replace(CT.Item(i).ParameterName, "''' + " & CT.Item(i).ParameterName & " + '''")

返回:

[some sql code]... WHERE  ([RI].[INSTRUCTION_TIME]  >= ''' + @p1 + ''') AND ([RI].[ITEM_CATEGORY_UID]  IN (''' + @p2 + ''',''' + @p3 + ''',''' + @p4 + ''',''' + @p5 + ''',''' + @p6 + ''',''' + @p7 + ''')) AND ([RI].[ITEM_DETAIL_UID]  IN (''' + @p8 + ''',''' + @p9 + ''',''' + ''' + @p1 + '''0 + '''))')

''' + ''' + @p1 + '''0 + ''' 不正确,应该是''' + @p10 + ''',其他都正确。

编辑 2

根据要求,这里是“替换”之前的 SQLQP

[some sql]...WHERE  ([RI].[INSTRUCTION_TIME]  >= @p1) AND ([RI].[ITEM_CATEGORY_UID]  IN (@p2,@p3,@p4)) AND ([RI].[ITEM_TYPE_UID]  IN (@p5)) AND ([RI].[ITEM_DETAIL_UID]  IN (@p6,@p7,@p8,@p9,@p10))

它应该是这样的:

[some sql]...WHERE  ([RI].[INSTRUCTION_TIME]  >= ''' + @p1 + ''') AND ([RI].[ITEM_CATEGORY_UID]  IN (''' + @p2 + ''',''' + @p3 + ''',''' + @p4 + ''')) AND ([RI].[ITEM_TYPE_UID]  IN (''' + @p5 + ''')) AND ([RI].[ITEM_DETAIL_UID]  IN (''' + @p6 + ''',''' + @p7 + ''',''' + @p8 + ''',''' + @p9 + ''',''' + @p10 + '''))

【问题讨论】:

  • 现在还早,我还没有喝咖啡,但你能试试反转循环吗? For i=CT.Count-1 to 0 Step -1
  • 这是一个巧妙的小技巧,感谢您的建议。它确实专门为 SQL 变量工作。不幸的是,我没有提到该循环的另一部分,只是为了保持简单(请参阅更新的循环)。尽管“SQL”现在具有预期值,但 SQLQP 现在与反向循环之前的 SQL 存在完全相同的问题
  • 您能否展示一些示例数据以及这个新问题的预期结果是什么?如果您只是在做同样的事情,我不确定您为什么要关心 %。使用您最初提供的代码,这会将 @P1%@P1% 替换为适当的参数,.Replace() 除了匹配之外什么都不知道也不关心其他任何事情.就撇号而言,如果您正确使用参数,则无需包装类型,当您在 .Add 方法中指定类型时,参数会处理此问题。
  • 我已经用一些数据更新了我的问题以及预期的内容。请记住,这不是我的代码。我正在调试别人的软件,所以我不确定为什么 % 是必要的。至于撇号,如果不使用它们,我会收到一条错误消息,说我需要给 @p1 一个值
  • 好的,是时候在替换之前显示一个字符串的确切示例以及替换发生后它应该是什么样子了,因为我不明白你为什么不只是替换参数。为什么 ''' 或 '%' 甚至涉及替换方法。我知道 IN 子句值需要它们,但它仍然应该只是替换参数的问题。出于某种原因,我不知道为什么在字符串中需要 3,这不像您试图将文字引号放在字符串中并重复。

标签: sql sql-server vb.net stored-procedures parameters


【解决方案1】:

感谢@Charles May,问题解决了:

SQLQP = SQLQP.Replace(",", " , ")
SQLQP = SQLQP.Replace(")", " )")
SQLQP = SQLQP.Replace("(", "( ")

For i = CT.Count - 1 To 0 Step -1
    SQL = SQL.Replace(CT.Item(i).ParameterName, "'" & CT.Item(i).Value & "'")
    SQLQP = SQLQP.Replace(" " + CT.Item(i).ParameterName + " ", "''' + " & 
CT.Item(i).ParameterName & " + '''")
     End If
  Next

【讨论】:

    猜你喜欢
    • 2021-10-18
    • 1970-01-01
    • 2022-11-26
    • 1970-01-01
    相关资源
    最近更新 更多