2016-01-28 4 views
4

Сервер Oracle и Sql с использованием другого префикса для параметров в параметризованной строке.Параметрированный SQL, ORACLE и SQL Server с регулярным выражением

Sql с помощью @p1

ORA использования :p1

Я хотел бы использовать в моем SQL только @ и в случае, если база данных ORA используются все : символа должен быть заменяет @.

Не могли бы вы помочь мне создать регулярное выражение?

Вот некоторые примеры SQL:

update test_table set text = :p1 where text = 'jana:klara' or some_value = :value or info = 'two'

Похожий вопрос и альтернативные решения могут быть найдены here.

ответ

0

Правильное регулярное выражение:

statement = Regex.Replace(statement, @":(?=(?:'[^']*'|[^'\n])*$)", "@"); 
2

Вы можете использовать этот шаблон для поиска поиска:

(?<=\W):(?=\w+) 

Например:

string output = Regex.Replace(input, @"(?<=\W):(?=\w+)", "@"); 

Вот смысл картины:

  • (?<=\W) - Синтаксис (?<= ...) объявляет позитивный взгляд. Другими словами, любому совпадению должно предшествовать содержимое look-behind. В этом случае он объявляет, что совпадениям должен предшествовать символ без слова.
  • : - сопоставляет только двоеточие
  • (?=\w+) - Синтаксис (?= ...) объявляет положительный смотреть вперед. Другими словами, любое соответствие должно сопровождаться содержимым поискового запроса. В этом случае он объявляет, что за совпадением должен следовать один или несколько символов слова.

См. online demo.

Я не могу придумать какой-либо причины, по которой параметр будет первым в строке ввода, но если это было возможно, изменение его на (?<=^|\W):(?=\w+) также позаботится об этой ситуации.

+0

Я обнаружил, что замена этого UPDATE B_BSET SET VALUE_DATE = '14 .07.2011' WHERE BATCH_NAME = ': BWAG_ALM2' не работает правильно. : BWAG_ALM2 изменен на @ BWAG_ALM2. Есть идеи? –

+0

Как насчет этого ': (? = (?: '[^'] * '| [^' \ N]) * $)'? Я думаю, что это работает правильно. –