1

尝试运行我写的这个查询以返回课程中的文件列表,但是在将 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'

4

2 回答 2

3

由于xf2.ENTRY_IDINT,SQL 不会尝试连接这些值,而是将它们加在一起。您需要将其显式INT转换为 a 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 位长的 id ......

于 2013-10-10T14:06:23.170 回答
1

试试这个。你现在应该使用适当的范围将 xf.ENTRY_ID 和 xf2.ENTRY_ID 转换为 varchar 类型。希望您的代码能够正常工作。

像这样:

cast(xf.ENTRY_ID varchar(max)) + '_1' and cast(xf2.ENTRY_ID as varchar(max)) + '_1'
于 2013-10-11T07:48:20.520 回答