Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将varchar值“\u 1”转换为数据类型int时,转换失败_Sql_Sql Server_Sql Server 2008_Tsql - Fatal编程技术网

Sql 将varchar值“\u 1”转换为数据类型int时,转换失败

Sql 将varchar值“\u 1”转换为数据类型int时,转换失败,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,尝试运行此查询时,我编写了返回课程中文件列表的命令,但遇到以下错误:将varchar值“\u 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_resourc

尝试运行此查询时,我编写了返回课程中文件列表的命令,但遇到以下错误:将varchar值“\u 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+''u 1'和xf2.ENTRY_ID+''u 1'的连接处,因为xf2.ENTRY_ID是一个INT,SQL不会尝试连接这些值,而是将它们添加到一起。您需要显式地将INT转换为VARCHAR或CHAR,以便连接它们

改变

AND resource_id = xf2.ENTRY_ID + '_1'

我将VARCHAR20定义为ENTRY\u ID可以是BIGINT数据类型,尽管我认为您应该有太多的行才能需要20位长的ID…

因为xf2.ENTRY\u ID是一个INT,SQL不会尝试连接这些值,而是将它们添加到一起。您需要显式地将INT转换为VARCHAR或CHAR,以便连接它们

改变

AND resource_id = xf2.ENTRY_ID + '_1'


我将VARCHAR20定义为ENTRY\u ID可以是BIGINT数据类型,尽管我认为为了需要20位长的ID,您应该有太多的行…

试试这个。您应该在varchar类型中使用合适的范围强制转换xf.ENTRY\u ID和xf2.ENTRY\u ID,现在我使用最大长度进行相同的转换。希望你的代码能正常工作

像这样:

cast(xf.ENTRY_ID varchar(max)) + '_1' and cast(xf2.ENTRY_ID as varchar(max)) + '_1'

试试这个。你应该在varchar类型中使用appropirate范围强制转换xf.ENTRY\u ID和xf2.ENTRY\u ID,现在我使用最大长度进行相同的转换。希望你的代码能正常工作

像这样:

cast(xf.ENTRY_ID varchar(max)) + '_1' and cast(xf2.ENTRY_ID as varchar(max)) + '_1'

.@AaronBertrand我不知道这个例子的正确长度,这就是我忽略它的原因。@AaronBertrand我甚至不知道它是TIMYINT、SMALLINT、INT还是BIGINT…那么,什么对这个例子最好呢?我通常使用VARCHAR12表示INT,但如果它可能是BIGINT,那么20应该是安全的。这个例子不是问题,这是关于始终推广最佳实践的,不,它仍然不会像它需要的那样多。如果某个数据类型大于30个字符,并转换为无长度的varchar,它将在30处截断。试试看:从sys.all_objects中选择前10名CONVERTVARCHAR和name,其中LENname>30@AaronBertrand我不知道这个例子的正确长度,这就是我忽略它的原因。@AaronBertrand我甚至不知道它是TIMYINT、SMALLINT、INT还是BIGINT…那么,什么对这个例子最好呢?我通常使用VARCHAR12表示INT,但如果它可能是BIGINT,那么20应该是安全的。这个例子不是问题,这是关于始终推广最佳实践的,不,它仍然不会像它需要的那样多。如果某个数据类型大于30个字符,并转换为无长度的varchar,它将在30处截断。试试看:选择前10名,CONVERTVARCHAR,name FROM sys.all_objects,其中LENname>30;
cast(xf.ENTRY_ID varchar(max)) + '_1' and cast(xf2.ENTRY_ID as varchar(max)) + '_1'