2013-10-10 30 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_IDINT,SQL不會試圖串聯的值,但把它們加起來。您需要明確地將INT轉換爲VARCHARCHAR以連接它們。

變化

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位長的IDS太多的行...

+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類型與適當的範圍現在即時im使用最大長度爲相同。希望你的代碼能夠工作。

像這樣:

cast(xf.ENTRY_ID varchar(max)) + '_1' and cast(xf2.ENTRY_ID as varchar(max)) + '_1' 
相關問題