2013-06-26 35 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