2013-10-10 2 views
1

Пытаясь запустить этот запрос, я написал, чтобы вернуть список файлов в курсе, но столкнулся с этой ошибкой, когда преобразование не удалось при преобразовании значения varchar '_1 'к типу данных int.Ошибка преобразования при преобразовании значения varchar '_1' в тип данных int

SELECT cm.course_id, cc.title title, cc.dtmodified dtmodified, MIN(xf.FILE_SIZE) file_size, MIN(crl.resource_id) resource_id, MIN(xu.FULL_PATH) full_path 
    FROM BBLEARN.dbo.cms_resource_link crl 
    INNER JOIN BBLEARN.dbo.course_contents cc ON cc.pk1 = crl.parent_pk1 
    INNER JOIN BBLEARN.dbo.course_main cm ON cm.pk1 = crl.crsmain_pk1 
    INNER JOIN BBLEARN.dbo.course_users cu ON cm.pk1 = cu.crsmain_pk1 
    INNER JOIN BBLEARN.dbo.users u ON cu.users_pk1 = u.pk1 
    INNER JOIN BBLEARN_CMS_DOC.dbo.XYF_FILES xf ON crl.resource_id = xf.ENTRY_ID + '_1' 
    INNER JOIN BBLEARN_CMS_DOC.dbo.XYF_URLS xu ON xu.FILE_ID = xf.FILE_ID 
    INNER JOIN BBLEARN_CMS_DOC.dbo.XYF_FILES xf2 ON xu.PARENT_ID = xf2.FILE_ID 
    WHERE crl.parent_data_type='content' 
    AND cu.role='P' 
    AND crl.storage_type='PUBLIC' 
    AND xf.FILE_TYPE_CODE='F' 
    AND (LOWER(xu.FILE_NAME) LIKE N'%.mov%' or LOWER(xu.FILE_NAME) LIKE N'%.avi%' or LOWER(xu.FILE_NAME) LIKE N'%.wm%' or LOWER(xu.FILE_NAME) LIKE N'%.mp%' or LOWER(xu.FILE_NAME) LIKE N'%.rm%' or LOWER(xu.FILE_NAME) LIKE N'%.flv%' or LOWER(xu.FILE_NAME) LIKE N'%.amr%' or LOWER(xu.FILE_NAME) LIKE N'%.aif%' or LOWER(xu.FILE_NAME) LIKE N'%.aup%' or LOWER(xu.FILE_NAME) LIKE N'%.m4%' or LOWER(xu.FILE_NAME) LIKE N'%.wav%' or LOWER(xu.FILE_NAME) LIKE N'%.swf%') 
    AND xu.FULL_PATH NOT LIKE '/internal/%' 
    AND NOT EXISTS (
       SELECT 1 FROM BBLEARN.dbo.cms_resource_link 
       WHERE crsmain_pk1 = crl.crsmain_pk1 
       AND parent_pk1 = crl.parent_pk1 
       AND parent_data_type='content' 
       AND resource_id = xf2.ENTRY_ID + '_1') 
    GROUP BY cm.course_id, cc.pk1, cc.title, cc.dtmodified ORDER BY 1; 

Это показывает в строке 7 и 21, я считаю, где есть конкатенация xf.ENTRY_ID + '_1' и xf2.ENTRY_ID + '_1'

ответ

3

Поскольку xf2.ENTRY_ID является INT, SQL не будет пытаться объединить значения, но добавить их вместе. Вам необходимо явно наложить INT на VARCHAR или CHAR, чтобы объединить их.

Изменить

AND resource_id = xf2.ENTRY_ID + '_1' 

Для

AND resource_id = CONVERT(VARCHAR(20),xf2.ENTRY_ID) + '_1' 

И

INNER JOIN BBLEARN_CMS_DOC.dbo.XYF_FILES xf ON crl.resource_id = xf.ENTRY_ID + '_1' 

Для

INNER JOIN BBLEARN_CMS_DOC.dbo.XYF_FILES xf ON crl.resource_id = CONVERT(VARCHAR(20),xf.ENTRY_ID) + '_1' 

я определяю VARCHAR(20), как ENTRY_ID может быть BIGINT типа данных (хотя я думаю, что вы должны иметь слишком много строк, чтобы нужно 20 значные идентификаторы ...

+0

[Пожалуйста, пожалуйста, пожалуйста, укажите длину VARCHAR] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/09/bad-habits- к ножным объявляющего-VARCHAR-без-length.aspx). –

+0

@AaronBertrand Я бы не знал правильную длину для этого случая, поэтому я его пропустил. –

+0

@AaronBertrand Я даже не знаю наверняка, если это 'TIMYINT',' SMALLINT', 'INT' или' BIGINT' ... Итак, что было бы лучше всего для этого случая? –

1

попробовать this.You опускали xf.ENTRY_ID и xf2.ENTRY_ID в varchar-типе с подходящим диапазоном прямо сейчас, используя максимальную длину для того же самого. Надеюсь, ваш код будет работать.

Как это:

cast(xf.ENTRY_ID varchar(max)) + '_1' and cast(xf2.ENTRY_ID as varchar(max)) + '_1' 
Смежные вопросы