2013-06-26 33 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值是一个整数,将它转换为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