SQL Server拼接动态SQL出现collate排序规则冲突报错如何解决
排序规则冲突报错解决方案
报错的核心原因是动态SQL拼接过程中,不同排序规则的varchar值执行+拼接操作时触发的校验失败:你写在单引号里的静态SQL片段排序规则,和ETL1.dbo.BI_GetSybaseIQDateExtent用户自定义函数返回的varchar值排序规则,分别对应SQL_Latin1_General_CP1_CI_AS和Latin1_General_CI_AS,二者不兼容导致报错。
修复方案
你之前尝试的collate写法错误,多了不必要的as关键字,collate语法后直接跟排序规则名称即可,以下是两种可行的修复方式:
方案1:在冲突的返回值后指定排序规则
直接修改动态SQL拼接的对应行,给函数返回值指定统一排序规则:
SET @SQL_STR = ' SELECT A_REC, B_REC, CALL_SOURCE, CALL_DEST, A_NUM, B_NUM, DURATION, NETWORK, REC_TYPE FROM OPENQUERY(CDRGO_SYBASE_MEDIATION, '' SELECT a_rec, b_rec, call_source, call_dest, a_num, b_num, duration, network, rec_type FROM DE.BI_DATA WHERE ' + ETL1.dbo.BI_GetSybaseIQDateExtent(@startdate, @enddate, 'A') collate SQL_Latin1_General_CP1_CI_AS + ' '') SV'
方案2:声明变量时统一指定排序规则(更省心)
直接修改@sql_str变量的声明语句,指定固定排序规则,后续所有赋值给该变量的字符串都会自动转换为对应排序规则,不需要再单独给每个拼接项加collate:
-- 替换原有的@sql_str声明行即可 DECLARE @sql_str VARCHAR (max) collate SQL_Latin1_General_CP1_CI_AS
内容的提问来源于stack exchange,提问作者gfernandes
相关产品推荐
相关产品推荐

