【问题标题】:What am I missing? SQL Conversion Failure我错过了什么? SQL 转换失败
【发布时间】:2011-10-12 15:40:43
【问题描述】:

我正在尝试将stf.PrimarySchoolID(一个整数)添加到这个现有查询中。我有一个 bat 文件,它将使用此 SQL 语句导出 CSV。但是,当我打开导出的 CSV 时,我收到此错误:

Msg 245, Level 16, State 1, Server [SERVER NAME], Line 13
Conversion failed when converting the varchar value ',"' to data type int.

注意:stf.StaffNumber 不是整数,它是字母数字。

SET NOCOUNT ON;

SELECT '"'+
    stf.StaffNumber +'","'+
    stf.LastName +'","'+
    stf.FirstName +'","' +
    COALESCE(u.username, '')+'","'+
    COALESCE(sfc.[NAME],'') +'",'+
    stf.PrimarySchoolID
FROM dbo.UDF_GetCurrentAcademicSessions() cur
    JOIN dbo.Course c ON c.AcadSessionID = cur.AcadSessionId            
    JOIN dbo.Staff stf ON stf.StaffID = c.PrimaryTeacherID
    JOIN dbo.StaffClassification sfc ON sfc.StaffClassificationID = stf.PrimaryClassificationID 
    LEFT OUTER JOIN dbo.[User] u ON u.UserID = stf.UserID

你发现我的错误了吗?我对 SQL 语句不是很有经验,因此不胜感激。

【问题讨论】:

    标签: sql sql-server integer varchar


    【解决方案1】:

    在追加之前尝试将stf.StaffNumber 转换为 VARCHAR:

    CAST(stf.StaffNumber AS VARCHAR)
    

    这同样适用于您要附加字符串的任何数值。

    编辑

    我相信这应该涵盖所有内容:

    SELECT '"'+    
    CAST(stf.StaffNumber AS VARCHAR) +'",'+    
    CAST(stf.PrimarySchoolID AS VARCHAR) +',"'+    
    stf.LastName +'","'+    
    stf.FirstName +'","' +    
    ISNULL(u.username, '')+'","'+    
    ISNULL(sfc.[NAME],'') +'",'+    
    CAST(stf.PrimarySchoolID AS VARCHAR)  
    

    附带说明,在只有一个条件的情况下,您应该使用ISNULLCOALESCE 可以正常工作,但它适用于多种条件,即COALESCE(Col1, Col2, Col3, Col4)

    【讨论】:

    • 这就是问题所在。感谢您提供关于 COALESCE 的信息。每个人的答案都是正确的,但是,我选择了您的答案,因为您发现并包含了对 我自己的行为的另一个错误的修复:重复stf.PrimarySchoolID:P
    【解决方案2】:

    SELECT的最后一行改为:

    CAST(stf.PrimarySchoolID as varchar)

    【讨论】:

      【解决方案3】:

      您需要将stf.PrimarySchoolID 转换为字符类型。

      ...
      CAST(stf.PrimarySchoolID AS VARCHAR(20)) -- You can fix length as needed
      ...
      

      【讨论】:

      • 这就是问题所在。谢谢你。并且,感谢您包含 varchar 长度。查找有关它的信息并了解它。
      【解决方案4】:

      在串联使用之前,您需要将stf.PrimarySchoolID 转换为字符类型(例如varchar):

      SET NOCOUNT ON;
      
      SELECT '"'+
          stf.StaffNumber +'",'+
          convert(varchar, stf.PrimarySchoolID) +',"'+
          stf.LastName +'","'+
          stf.FirstName +'","' +
          COALESCE(u.username, '')+'","'+
          COALESCE(sfc.[NAME],'') +'",'+
          stf.PrimarySchoolID
      FROM dbo.UDF_GetCurrentAcademicSessions() cur
          JOIN dbo.Course c ON c.AcadSessionID = cur.AcadSessionId            
          JOIN dbo.Staff stf ON stf.StaffID = c.PrimaryTeacherID
          JOIN dbo.StaffClassification sfc ON sfc.StaffClassificationID = stf.PrimaryClassificationID 
          LEFT OUTER JOIN dbo.[User] u ON u.UserID = stf.UserID
      

      您可以使用SQL Server's CONVERT or SQL ANSI's CAST 进行类型转换。

      【讨论】:

        【解决方案5】:

        由于 stf.PrimarySchoolID 是一个 int 并且您尝试将其连接到 varchar() 字段,因此您会收到此错误。试试看:

        SELECT '"'+
            stf.StaffNumber +'",'+
            cast(stf.PrimarySchoolID as varchar(10)) +',"'+
            stf.LastName +'","'+
            stf.FirstName +'","' +
            COALESCE(u.username, '')+'","'+
            COALESCE(sfc.[NAME],'') +'",'+
            stf.PrimarySchoolID
        

        【讨论】:

          【解决方案6】:

          联接表的列可能不匹配或联接给定的列。仔细检查哪些列,​​加入逻辑。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-12-15
            • 1970-01-01
            • 2012-07-22
            • 1970-01-01
            • 2012-05-11
            • 2019-02-02
            相关资源
            最近更新 更多