2013-06-26 4 views
-1

В SQL Server У меня есть запрос, который выглядит следующим образом (часть пункта большего запрос WHERE)SQL Server литье из таблицы

SELECT 1 
WHERE TPR.GRDE_PK IN 
    (
      SELECT CAST(String AS INT) 
      FROM dbo.Split_New(@GRADES, ',') 
    ) 

@Grades равно '14, 15' и dbo.Split_New является функция, которая возвращает таблицу с одним столбцом с именем String, который будет содержать «14» и «15». TPR.GRDE_PK имеет тип INT. Я получаю ошибку преобразования, когда пытаюсь выполнить эту строку, может ли кто-нибудь сказать мне, как ее исправить?

Вот что функция Split_New выглядит (Письменное кем-то более опытный, чем я, так что я не понимаю, все это):

function [dbo].[Split_New] ( 
@StringToSplit nvarchar(4000), 
@Separator varchar(128)) 
returns table as return 
with indices as 
( 
select 0 S, 1 E 
union all 
select E, charindex(@Separator, @StringToSplit, E) + len(@Separator) 
from indices 
where E > S 
) 
select substring(@StringToSplit,S, 
case when E > len(@Separator) then e-s-len(@Separator) else len(@StringToSplit) - s + 1 end) String 
--,S StartIndex   
from indices where S >0 
+0

Можете ли вы опубликовать функцию? –

+0

@Goat_CO Добавлено –

ответ

1

Проблема в том, ваше значение TPR.GRDE_PK является Integer, брось как VARCHAR():

SELECT 1 
WHERE CAST(TPR.GRDE_PK AS VARCHAR(25)) IN 
    (
      SELECT * 
      FROM dbo.Split_New(@GRADES, ',') 
    ) 

Функция работает нормально, она возвращает ожидаемую таблицу результатов, приведенных ваша строка.

В качестве альтернативы, вы можете избежать использования функции на всех с LIKE:

WHERE ','+CAST(TPR.GRDE_PK AS VARCHAR(25))+',' LIKE '%,'[email protected]+',%' 
0

Трудно точно сказать, что это не глядя в функции.

Сначала посмотреть, если вы получите правильные результаты от функции:

SELECT String FROM dbo.Split_New(@GRADES, ',') 

String могут иметь начальные/конечные пробелы. Попробуйте обрезать их перед преобразованием/литья с использованием LTRIM() и RTRIM() функции

SELECT CONVERT(INT, LTRIM(RTRIM(String))) FROM dbo.Split_New(@GRADES, ',') 

ISNUMERIC() функция не является идеальной для фильтрации и преобразования, как она возвращает 1 для некоторых символов, которые не являются числами.

+0

Пробовал добавлять 'LTRIM' и' RTRIM', ту же ошибку .. –

+0

Вы пробовали эту функцию в одиночку? Какая ваша строка @grades? – Kaf