2012-05-01 118 views
1
SELECT  SUM(PayAmount) 
FROM   TeacherPayment_Detail 
WHERE  TeacherPaymentId IN (TeacherPayment.Advance_IDs) 

我想要教師通過此查詢進行的總結。其中Advance_IDs是教師採用的預測編號。但SQL提供以下錯誤。將nvarchar值'20,21'轉換爲數據類型int時的轉換失敗

Conversion failed when converting the nvarchar value '20,21' to data type int. 

注意,如果Advance_IDs有一個值,那麼誤差不occure在一個以上的值 這個錯誤occure我探索轉換爲nvarchar通過劃分功能爲int,但我不發現我的要求的功能。

回答

3

這是由於

SELECT  SUM(PayAmount) 
FROM   TeacherPayment_Detail 
WHERE  TeacherPaymentId IN ('20,21') 

但SQL Server希望

SELECT  SUM(PayAmount) 
    FROM   TeacherPayment_Detail 
    WHERE  TeacherPaymentId IN ('20','21') 

所以你可以做以下

  1. 任何一個寫一些功能,這將tokenise了「 20,21'到'20','21'在 SQL(最好做一個函數,它會返回一個表)

    SELECT SUM(PayAmount) FROM TeacherPayment_Detail WHERE TeacherPaymentId IN(來自Function_Split選擇VAL(TeacherPayment.Advance_IDs)的形式 'VAL1'

  2. 通值, 'val2的'

當它只有一個值時,它將是'val'並起作用,但是當它不止一個值時,它將'val1,val2'。所以這不會導致錯誤。如果你通過這樣的 'VAL1', '值2'

** **功能

CREATE FUNCTION GetTokenizeValue 
(
    @strCSVString VARCHAR(4000) 
) 
RETURNS 
@Result TABLE 
(
    -- Add the column definitions for the TABLE variable here 
    ID int 
) 
AS 
BEGIN 


; WITH CTE(Start, [Stop]) AS 
(
    SELECT 1, CHARINDEX(',' , @strCSVString) 
    UNION ALL 
    SELECT [Stop] + 1, CHARINDEX(',' ,@strCSVString , [Stop] + 1) 
    FROM CTE 
    WHERE [Stop] > 0 
) 
INSERT INTO @Result 
SELECT SUBSTRING(@strCSVString , Start, CASE WHEN stop > 0 THEN [Stop]-Start ELSE 4000 END) AS stringValue 
FROM CTE 

RETURN 
END 

您選擇查詢將

SELECT  SUM(PayAmount) 
FROM   TeacherPayment_Detail 
WHERE  TeacherPaymentId IN (select * from dbo.GetTokenizeValue(TeacherPayment.Advance_IDs)) 
+0

謝謝你幫助我。我理解這個問題。但我不知道如何在sql中創建一個函數。你能寄給我這個功能嗎? –

+0

我通過添加函數修改了答案。請試試這個 – kbvishnu

+0

謝謝你幫助我。我成功地得到了我的結果。我已經在你的帖子之前使用過Ritesh D鏈接,但你的功能對男士也有幫助。 –

2

您可以創建一個將工作使用以下鏈接分割功能: Convert Comma Separated String to Table Column

+0

您能否提供更多信息並將該鏈接用作參考?在目前的狀態下,這是一個[只鏈接回答](http://meta.stackexchange。COM /問題/ 8231 /是 - 答案 - 即,剛剛包含鏈接別處 - 真的好 - 答案)。 –

0

使用以下用戶定義的功能

Create Function dbo.CsvToInt (@Array varchar(1000)) 
returns @IntTable table (IntValue int) AS 
begin 
declare @separator char(1) 
set @separator = ',' 
declare @separator_position 
int declare @array_value varchar(1000) 
set @array = @array + ',' 
while patindex('%,%' , @array) <> 0 
begin 
select @separator_position = patindex('%,%' , @array) 
select @array_value = left(@array, @separator_position - 1) 
Insert @IntTable Values (Cast(@array_value as int)) 
select @array = stuff(@array, 1, @separator_position, '') 
end 
return end 

使用如下

Select * from dbo.CsvToInt('1,5,11') 

在你的情況

SELECT  SUM(PayAmount) 
FROM   TeacherPayment_Detail 
WHERE  TeacherPaymentId IN (Select * from dbo.CsvToInt(TeacherPayment.Advance_IDs)) 
相關問題