asp.net - 操作数数据类型 varchar 对于求和运算符无效 - 过程错误更正

标签 asp.net sql-server-2005 stored-procedures type-conversion error-correction

我正在使用 SQL Server - 2005...

ALTER Proc [dbo].[ExamResult] (@Course_Id varchar(100), @Semester varchar(10))
as
begin
    declare @subjname varchar(100)  
    declare @subjects varchar(7000)  
    declare @subjectsselection varchar(7000)  
    declare @SumSelection varchar(7000)  
    declare @NoOfSubjects int
    set @NoOfSubjects = 0

    set @subjects = ''  
    set @subjectsselection = '' 
    set @SumSelection = ''

    DECLARE subject_cursor CURSOR  
    FOR SELECT distinct Subject_Name FROM Exam_Result where course_id = @Course_Id And Semester = @Semester 

    OPEN subject_cursor  

    FETCH NEXT FROM subject_cursor  
    INTO @subjname  

    WHILE @@FETCH_STATUS = 0  
    BEGIN  
        set @subjects = @subjects + '[' + @subjname + '],'  
        set @subjectsselection = @subjectsselection + 'Sum(Isnull([' + @subjname + '],0)) As [' + @subjname + '],' 
        set @SumSelection = @SumSelection + 'Sum(Isnull([' + @subjname + '],0))+' 

        set @NoOfSubjects = @NoOfSubjects + 1

        FETCH NEXT FROM subject_cursor  
        INTO @subjname  
    End  
    CLOSE subject_cursor;  
    DEALLOCATE subject_cursor;  

    select @subjects = LEFT(@subjects, LEN(@subjects) - 1)  
    select @subjectsselection = LEFT(@subjectsselection, LEN(@subjectsselection) - 1)  
    select @SumSelection = LEFT(@SumSelection, LEN(@SumSelection) - 1)  

    print @subjects  
    print @subjectsselection  
    print @SumSelection

    declare @query nvarchar(4000)  

    set @query = 'select S.Enroll_Number, pvt.Student_Name, pvt.Course_Id, pvt.Semester, ' + @subjectsselection + ',' 
    set @query = @query + 'Exam_Type,' + @SumSelection + ' As Grand_Total, '
    set @query = @query + '(' + @SumSelection + ')' + '/' + convert(varchar(10),@NoOfSubjects) + ' As Avg'
    set @query = @query + ' From '  
    set @query = @query + '(select Enroll_Number, Student_Name, Course_Id, Semester, Subject_Name, MarksObtained, Exam_Type from Exam_Result ) ps '  
    set @query = @query + ' pivot(sum(MarksObtained) for Subject_Name in (' + @subjects + ')) as pvt'  
    set @query = @query + ' inner join Stud_Info S on S.Enroll_Number = pvt.Enroll_Number '
    set @query = @query + ' where pvt.Course_Id = ''' + @Course_Id + ''' and pvt.Semester = ''' + @Semester + ''''
    set @query = @query + ' group by S.Enroll_Number, pvt.Student_Name, pvt.Course_Id, pvt.Semester, Exam_Type'
    print @query
    exec sp_executesql @query  
end

Exam_Result 表:

CREATE TABLE [dbo].[Exam_Result](
    [Result_Id] [int] IDENTITY(1,1) NOT NULL,
    [Enroll_Number] [varchar](50) NULL,
    [Student_Name] [varchar](100) NULL,
    [Course_Id] [varchar](50) NULL,
    [Semester] [varchar](50) NULL,
    [Subject_Id] [varchar](50) NULL,
    [Subject_Name] [varchar](50) NULL,
    [MarksObtained] [Varchar](10) NULL,
    [Exam_Type] [varchar](50) NULL)

数据查询示例...

INSERT into Exam_Result VALUES('11147','Mr.Mack28','CIV','1','PS1','ps1','60','Final')
INSERT into Exam_Result VALUES('11147','Mr.Mack28','CIV','3','PS1','ps1','70','Final')
INSERT into Exam_Result VALUES('11147','Mr.Mack28','CIV','3','PS1','ps1','80','Final')
INSERT into Exam_Result VALUES('11147','Mr.Mack28','CIV','3','PS1','ps1','20','Internal')
INSERT into Exam_Result VALUES('11147','Mr.Mack28','CIV','3','PS1','ps1','22','Internal')

Student_Info 表:我仅用于检索 Student_Information,例如 Enroll_Number...

CREATE TABLE [dbo].[Stud_Info](
    [Enroll_Number] [varchar](20) NOT NULL,
    [Student_Name] [varchar](20) NULL,
    [Course_Type] [varchar](20) NULL,
    [Course_Id] [varchar](20) NULL,
    [Semester] [varchar](20) NULL,
    [Password] [varchar](20) NULL,
    [Gender] [varchar](6) NULL,
    [City] [varchar](15) NULL,
    [Mobile_Number] [varchar](10) NULL)

它给了我这样的错误......

Msg 8117, Level 16, State 1, Line 1
Operand data type varchar is invalid for sum operator.

Rahul:根据你的回答,我像这样更新了,但它仍然给出错误......

set @query = @query + ' pivot(sum(cast(MarksObtained as int)) for Subject_Name in (' + @subjects + ')) as pvt'  

我认为它给出了错误,因为我正在使用 MarksObtained 列(as varchar(10))...请给我一个如何转换 varcharint,以便可以完成总 MarksObtained 的求和。

最佳答案

您可以这样转换:

SUM (CONVERT(int,<your varchar column>))

如果您的 varchar 列实际上包含数值,则这将起作用。否则,您可以尝试使用 cast 函数进行转换,例如:

sum(cast(varchar_column as int))

编辑:

创建了一个仅包含 2 列(名称和标记)的示例表,均为 varchar(10) 类型,并向其中插入了一些数据。这样我的 select * 看起来像

name            marksobtained
Mr. Anil             30
Mr. sunil            70
Mr. patel            70

总结分数,例如

select SUM(cast(marksobtained as int)) as 'totalmarksobtained' from sampletab

返回170

@subjects 有什么值?发布一些示例。

关于asp.net - 操作数数据类型 varchar 对于求和运算符无效 - 过程错误更正,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10460237/

相关文章:

asp.net - 如果文本框名称在字符串变量中,如何获取 clientID

Sql Server 相当于 COUNTIF 聚合函数

c# - 索引超出范围。必须是非负数且小于集合的大小

c# - 变量名 '@Param'已经被声明

c# - 如何检查任何表单字段数据是否已更改?

c# - 如何使用sql从四个sql表在rdlc中显示销售摘要

sql-server - 从 SQL 存储过程导出文本文件

sql - SQL Server 函数性能不佳

sql - MySQL foreach 替代过程

javascript - 使用 IIS(非 Express)将 Visual Studio 2013(或 2015)JS 调试器附加到浏览器