ahmed elbarbary

ahmed elbarbary

  • 636
  • 1.6k
  • 282.1k

when Build Dynamic query Error display converting data type varchar to

Jun 22 2020 9:30 PM
I work on SQL server 2012 when Build dynamic Query I get error
 
Msg 8114, Level 16, State 5, Line 16 Error converting data type varchar to float.
 
so How to solve this Error ?
 
I build dynamic query based on @Header and @column and @Body .
 
@Header represent header must display as Headers .
@column represent pivot columns .
@Body represent select query for data .
  1. create table #FinalTable  
  2. (  
  3. PART_ID nvarchar(50) ,  
  4. CompanyName nvarchar(50),  
  5. PartNumber nvarchar(50),  
  6. DKFeatureName nvarchar(100),  
  7. value float,  
  8. StatusId int,  
  9. DisplayOrder int,  
  10. splitFlag bit  
  11. )  
  12. insert into #FinalTable  
  13. values  
  14. ('1222','Honda','silicon','package','15.50Am',2,5,0),  
  15. ('1900','MERCEIS','GLASS','family','90.00Am',2,2,1),--have column per Unit on @Header because FlagAllow=1  
  16. ('5000','TOYOTA','alominia','source','70.20kg',2,1,0),  
  17. ('8000','MACDA','motor','parametric','50.40kg',2,3,1),--have column per Unit on @Header because FlagAllow=1  
  18. ('8900','JEB','mirror','noparametric','75.35kg',2,4,0)  
  19. DECLARE @Header NVARCHAR(MAX)  
  20. SELECT  
  21. @Header = STUFF(  
  22. (  
  23. SELECT ', ' + case when A.splitFlag = 1 and a.value<> '-' and (a.Value is not nullthen ''''+A.DKFeatureName +''' as '''+A.DKFeatureName+''','''+ A.DKFeatureName + 'Units' +''' as ''' + A.DKFeatureName +'Units' +'''' else ''''+A.DKFeatureName +''' as ''' + A.DKFeatureName +'''' end  
  24. FROM #FinalTable A  
  25. where StatusId=2  
  26. ORDER BY DisplayOrder  
  27. FOR XML PATH ('')  
  28. ),1,2,''  
  29. )  
  30. DECLARE @Columns NVARCHAR(MAX)  
  31. SELECT  
  32. @Columns = STUFF(  
  33. (  
  34. SELECT ', ' + case when A.splitFlag = 1 and a.value<> '-' and (a.Value is not nullthen '['+A.DKFeatureName+'],['+A.DKFeatureName+'Unit]' else quotename(A.DKFeatureName) end  
  35. FROM #FinalTable A where StatusId=2  
  36. ORDER BY DisplayOrder  
  37. FOR XML PATH ('')  
  38. ),1,2,''  
  39. )  
  40. DECLARE @Body NVARCHAR(MAX)  
  41. SELECT  
  42. @Body = STUFF(  
  43. (  
  44. SELECT ', ' + case when A.splitFlag = 1 and a.value<> '-' and (a.Value is not nullthen 'LEFT(' + QUOTENAME (A.DKFeatureName) + ',PATINDEX(''%[^0-9.]%'',' + QUOTENAME (A.DKFeatureName) + '+ ' + ''' ''' + ')-1) as ['+A.DKFeatureName+'],RIGHT('+ QUOTENAME (A.DKFeatureName) +',LEN('+ QUOTENAME (A.DKFeatureName) +') - PATINDEX(''%[^0-9.]%'','+ QUOTENAME (A.DKFeatureName) +')+1) as ['+A.DKFeatureName +'Units'+']' else quotename(A.DKFeatureName) end  
  45. FROM #FinalTable A  
  46. where StatusId=2  
  47. ORDER BY A.DisplayOrder  
  48. FOR XML PATH ('')  
  49. ),1,2,''  
  50. )  
  51. DECLARE @SQL NVARCHAR(MAX)  
  52. select @SQL =CONCAT('  
  53. SELECT * Into #NewTable  
  54. FROM #FinalTable  
  55. PIVOT(max(Value) FOR DKFeatureName IN ('+@Columns+')) AS PVTTable  
  56. ',  
  57. N' Select ''PART_ID'' as ''PART_ID'' ,''CompanyName'' as ''CompanyName'',''PartNumber'' as ''PartNumber'' , ' +@Header + '     
  58. union all  
  59. select PART_ID,CompanyName,PartNumber, ' +@Body + ' from #NewTable  
  60. ')  
  61. EXEC (@SQL)  

Answers (2)