-1

在 SQL Server 中,我有一个看起来像这样的查询(WHERE较大查询的子句的一部分)

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

@Grades等于'14,15'并且是一个函数,它返回一个表,其中包含一个名为“14”和“15”dbo.Split_New的单列。是类型。当我尝试执行此行时出现转换错误,谁能告诉我如何修复它?StringTPR.GRDE_PKINT

这是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
4

2 回答 2

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 '%,'+@GRADES+',%'
于 2013-06-26T16:24:40.933 回答
0

不看函数很难准确地说出它是什么。

首先看看你是否从函数中得到正确的结果:

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

String可能有前导/尾随空格。LTRIM()在使用和RTRIM()函数转换/铸造之前尝试修剪它们

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

ISNUMERIC()函数不适合过滤和转换,因为它对某些不是数字的字符返回 1。

于 2013-06-26T15:51:56.033 回答