1
SELECT     SUM(PayAmount)
FROM          TeacherPayment_Detail
WHERE      TeacherPaymentId IN (TeacherPayment.Advance_IDs)

このクエリで教師が取った前払いの合計が必要です。Advance_IDs先生が取った事前の記録のIDはどこにありますか. しかし、SQLは次のエラーを出します。

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

関数を分割してnvarcharAdvance_IDsを int に変換する方法を調べましたが、必要な関数が見つかりませんでした。

4

3 に答える 3

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. SQL で '20,21' を '20','21' にトークン化する関数を作成します (テーブルを返す関数を実行するのが最善です)。

    SELECT SUM(PayAmount) FROM TeacherPayment_Detail WHERE TeacherPaymentId IN (Function_Split(TeacherPayment.Advance_IDs から値を選択)

  2. 'val1','val2' の形式で値を渡します

値が1つだけの場合は「val」となり動作しますが、複数の値の場合は「val1,val2」となります。したがって、これは機能せず、エラーが発生します。この「val1」、「val2」のように渡すと機能します

** 関数 **

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))
于 2012-05-01T06:53:09.750 に答える
2

次のリンクを使用して分割関数を作成できます: コンマ区切り文字列をテーブル列に変換

于 2012-05-01T07:15:38.547 に答える
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))
于 2014-03-12T09:21:06.050 に答える