如何解决SQL Server动态SQL执行时nvarchar转int类型转换失败错误
问题根因
本次类型转换错误的核心原因有3个:
- 特征规则配置错误:
TAllfeatures表中ZfeatureKey=1505730036的判断逻辑是数值比较>1000,但你把它的IsNumericValues属性设为0,导致拼接SQL时错误用字符串类型的Name字段和数值1000做比较,SQL Server会自动尝试把Name字段的24VAC/DC转成int,触发转换失败报错。 - 动态SQL拼接逻辑未区分字段类型:字符串类型的判断值和数值类型的判断字段混用,没有做明确的类型区分。
- 之前的修复逻辑错误:你尝试的修改给bigint类型的
ZfeatureKey加了单引号,还错误拆分了EStrat的结构,不仅没有解决类型转换问题,还导致判断逻辑完全错乱。
修复方案
第一步:修正特征规则的基础配置
先把数值比较类的特征IsNumericValues属性修正为1,匹配它的判断逻辑:
UPDATE dbo.TAllfeatures SET IsNumericValues = 1 WHERE ZfeatureKey = 1505730036
第二步:修正动态SQL拼接逻辑
调整@ConStr的拼接规则,根据IsNumericValues自动选择判断字段,同时替换EStrat里的HTML转义字符:
DECLARE @ConStr nvarchar(max) = STUFF(( SELECT CONCAT( ' Or (PM.ZfeatureKey = ', CC.ZfeatureKey, -- 根据属性自动选择判断字段:数值类型用AcceptedValuesOption_Value,字符串类型用Name IIF(AL.IsNumericValues = 1, ' And AcceptedValuesOption_Value ', ' And Name '), -- 替换HTML转义的大于号 REPLACE(CAST(EStrat AS NVARCHAR(2500)), '>', '>'), ')' ) FROM dbo.TCondition CC INNER JOIN dbo.TAllfeatures AL WITH(NOLOCK) ON AL.ZfeatureKey = CC.ZfeatureKey FOR XML PATH(''), TYPE ).value('(./text())[1]','nvarchar(max)'),1,3,'')
第三步:调整最终执行的SQL拼接逻辑
避免隐式类型转换,先统计规则数量再拼接:
DECLARE @RuleCount INT = (SELECT COUNT(1) FROM TCondition WITH(NOLOCK)) DECLARE @Sql nvarchar(max)= CONCAT( 'INSERT INTO dbo.TAllData(PartID,Code,CodeTypeID,RevisionID,ZPLID ,ConCount)', ' SELECT PartID,Code,Co.CodeTypeID,Co.RevisionID,Co.ZPLID,Count(1) as ConCount FROM dbo.TPartAttributes PM WITH(NOLOCK) INNER JOIN dbo.TCondition Co WITH(NOLOCK) ON Co.ZfeatureKey = PM.ZfeatureKey ', 'Where (1=1 and ' , @ConStr,' ) Group By PartID,Code,Co.CodeTypeID,Co.RevisionID,Co.ZPLID Having Count(1) >= ', CAST(@RuleCount AS NVARCHAR(10)) ) -- 可先打印生成的SQL校验逻辑是否正确 -- PRINT @SQL EXEC (@SQL)
内容的提问来源于stack exchange,提问作者abeer shlby
相关产品推荐
相关产品推荐

