функция приведения значений SQL IN - PullRequest
0 голосов
/ 08 ноября 2010

У меня есть проблема, когда я передаю параметр NVARCHAR хранимой процедуре, а тип поля в таблице для этого параметра - INT.

Я делаю это, потому что я использую функцию IN, и, например, если я хочу отправить несколько параметров, это единственный возможный способ сделать это через .NET. Или нет? SP не выполняется из-за неправильного типа, и я пытаюсь привести значение, но я получаю ошибку. Вот как я пытаюсь: Пример:

@Parameter nvarchar OrderStatusID = ('30, 40')

(o.OrderStatusID IN (CAST(@OrderStatusID as int)) OR @OrderStatusID IS NULL)

Есть ли способ разыгрывать каждое значение отдельно или как лучше всего разыграть целое значение как INT.

Ответы [ 2 ]

1 голос
/ 08 ноября 2010

Лучший способ сделать это - преобразовать входные параметры в таблицу, а затем использовать оператор in для этой таблицы.

Вы можете сделать это с помощью CTE, например

WITH CTE ( pos, pos_begin, pos_end ) AS 
(
  SELECT 0, 1, CHARINDEX( ',', @p + ',' ) 
  UNION ALL
  SELECT pos + 1, pos_end + 1, CHARINDEX( ',', @p + ',', pos_end + 1 ) 
  FROM CTE
  WHERE CHARINDEX( ',', @p + ',', pos_end + 1 ) > 0 
), numList as
(
  SELECT SUBSTRING( @p, pos_begin , pos_end - pos_begin ) AS "value"
  FROM CTE
)
SELECT -- whatever you want
WHERE (o.OrderStatusID IN (SELECT CAST(value AS int) FROM numList)) OR @p is NULL

Есть и другие способы сделать это, прочитайте о многих других методах здесь - откуда это было адаптировано.http://www.projectdmx.com/tsql/sqlarrays.aspx#Cte

(Примечание: поскольку я быстро адаптировал это со страницы примера, я не оптимизировал его, ясно, что CTE можно сделать проще и, следовательно, быстрее.)

0 голосов
/ 20 ноября 2010
@Parameter nvarchar OrderStatusID = ('30, 40')

(o.OrderStatusID IN (CAST(@OrderStatusID as int)) OR @OrderStatusID IS NULL)

Обычно я делаю что-то вроде этого

SET @OrderStatusId = ','+@OrderStatusID+','

CharIndex(','+trim(str(o.OrderStatus))+',' , @OrderStatusId)  >0

Но это не очень быстро, использование функций в предложении WHERE влияет на производительность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...