Что мне не хватает? Ошибка преобразования SQL - PullRequest
2 голосов
/ 12 октября 2011

Я пытаюсь добавить 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, поэтому любая помощь приветствуется.

Ответы [ 6 ]

1 голос
/ 12 октября 2011

Вам необходимо привести 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 CONVERT.или SQL ANSI CAST.

1 голос
/ 12 октября 2011

Вы хотите CAST stf.PrimarySchoolID для типа символов.

...
CAST(stf.PrimarySchoolID AS VARCHAR(20)) -- You can fix length as needed
...
1 голос
/ 12 октября 2011

Изменить последнюю строку SELECT на:

CAST(stf.PrimarySchoolID as varchar)

1 голос
/ 12 октября 2011

Попробуйте наложить stf.StaffNumber на VARCHAR перед добавлением к нему:

CAST(stf.StaffNumber AS VARCHAR)

То же самое относится к любым числовым значениям, к которым вы добавляете строку.

EDIT

Я считаю, что это должно охватывать все:

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)  

В примечании, вы должны использовать ISNULL в тех случаях, когда есть только одно условие. COALESCE будет работать нормально, но он подключен для нескольких условий, т. Е. COALESCE(Col1, Col2, Col3, Col4)

0 голосов
/ 31 августа 2016

Соединяющие столбцы таблиц могут не совпадать или объединяться в данных столбцах. Дважды проверьте, по каким столбцам дается логика объединения.

0 голосов
/ 12 октября 2011

Поскольку stf.PrimarySchoolID является целым числом, и вы пытаетесь объединить его с полем varchar (), вы получаете эту ошибку. Попробуйте следующее:

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