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

我想要一个老师通过这个查询获得的预付款总和。Advance_IDs老师提前记录的身份证在哪里?但sql给出以下错误。

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

请注意,如果Advance_IDs有一个值,则不会发生此错误,此错误发生在我探索通过拆分函数将 nvarchar 转换为 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 选择 val)

  2. 以 'val1','val2' 形式传递值

当它只有一个值时,它将是 '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 回答