2014-09-05 5 views
0

У меня есть пользовательская функция в T-SQL, которая использует CHARINDEX() внутренне. Я принимаю параметр @caseSensitivity (бит) в качестве входного сигнала, который должен определять оболочку (сопоставление) функции CHARINDEX(). Есть ли способ сделать это без создания двух if-конструкций для каждого появления CHARINDEX()?CaseSensitivity в пользовательской функции T-SQL

+1

Можете ли вы разместить образец кода? – Jace

+0

Вы считали 'CASE' вместо' IF'. Зависит от вашей логики. – Tak

+0

@t_m, использование случая не принесет много пользы либо потому, что оно будет производить одинаковое количество и качество кода. – zhulien

ответ

1

К сожалению, есть isn't a way to set a connection-level collation override, если это то, о чем вы думали (я был).

Однако, если вы просто ищете способ управлять этим проще, вы можете оценить все запросы CHARINDEX как с учетом регистра, а затем использовать UPPER, чтобы сделать его нечувствительным к регистру, когда он @ caseSensitive равен нулю:

DECLARE @caseSensitivity BIT = 1 
DECLARE @input VARCHAR(3) = 'Abc' 
DECLARE @inputCheck VARCHAR(3) = 'B' 

IF @caseSensitivity = 0 
BEGIN 
    SET @input = UPPER(@input) 
    SET @inputCheck = UPPER(@input) 
END 

SELECT CHARINDEX(@inputCheck COLLATE SQL_Latin1_General_CP1_CS_AS, @input COLLATE SQL_Latin1_General_CP1_CS_AS, 0) 
+0

Это действительно отличное решение проблемы. Я искал что-то подобное. Спасибо! – zhulien

+0

Добро пожаловать! –