构建动态查询时,将数据类型 varchar 转换为 float 时显示错误 - 如何解决?
When building a dynamic query, an error is shown converting data type varchar to float - how to solve it?
我在 SQL Server 2012 上工作;构建动态查询时,出现此错误
Msg 8114, Level 16, State 5, Line 16
Error converting data type varchar to float
如何解决这个错误?
我基于 @Header
和 @column
以及 @Body
构建了一个动态查询。
@Header
表示header必须显示为headers.
@column
表示数据透视表列。
@Body
表示select查询数据。
CREATE TABLE #FinalTable
(
PART_ID nvarchar(50) ,
CompanyName nvarchar(50),
PartNumber nvarchar(50),
DKFeatureName nvarchar(100),
value float,
StatusId int,
DisplayOrder int,
splitFlag bit
)
INSERT INTO #FinalTable
VALUES
('1222', 'Honda', 'silicon', 'package', '15.50Am', 2, 5, 0),
('1900', 'MERCEIS', 'GLASS', 'family', '90.00Am', 2, 2, 1),--have column per Unit on @Header because FlagAllow=1
('5000', 'TOYOTA', 'alominia', 'source', '70.20kg', 2, 1, 0),
('8000', 'MACDA', 'motor', 'parametric', '50.40kg', 2, 3, 1),--have column per Unit on @Header because FlagAllow=1
('8900', 'JEB', 'mirror', 'noparametric', '75.35kg', 2, 4, 0)
DECLARE @Header NVARCHAR(MAX)
SELECT
@Header = STUFF((SELECT ', ' + CASE WHEN A.splitFlag = 1 AND a.value <> '-' AND (a.Value IS NOT NULL) THEN '''' + A.DKFeatureName + ''' AS '' '+ A.DKFeatureName + ''', ''' + A.DKFeatureName + 'Units' + ''' AS ''' + A.DKFeatureName +'Units' +'''' else ''''+A.DKFeatureName +''' as ''' + A.DKFeatureName +'''' END
FROM #FinalTable A
WHERE StatusId = 2
ORDER BY DisplayOrder
FOR XML PATH ('')), 1, 2, '')
DECLARE @Columns NVARCHAR(MAX)
SELECT
@Columns = STUFF(
(
SELECT ', ' + case when A.splitFlag = 1 and a.value<> '-' and (a.Value is not null) then '['+A.DKFeatureName+'],['+A.DKFeatureName+'Unit]' else quotename(A.DKFeatureName) end
FROM #FinalTable A where StatusId=2
ORDER BY DisplayOrder
FOR XML PATH ('')
),1,2,''
)
DECLARE @Body NVARCHAR(MAX)
SELECT
@Body = STUFF(
(
SELECT ', ' + case when A.splitFlag = 1 and a.value<> '-' and (a.Value is not null) then '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
FROM #FinalTable A
where StatusId=2
ORDER BY A.DisplayOrder
FOR XML PATH ('')
),1,2,''
)
DECLARE @SQL NVARCHAR(MAX)
select @SQL =CONCAT('
SELECT * Into #NewTable
FROM #FinalTable
PIVOT(max(Value) FOR DKFeatureName IN ('+@Columns+')) AS PVTTable
',
N' Select ''PART_ID'' as ''PART_ID'' ,''CompanyName'' as ''CompanyName'',''PartNumber'' as ''PartNumber'' , ' +@Header + '
union all
select PART_ID,CompanyName,PartNumber, ' +@Body + ' from #NewTable
')
EXEC (@SQL)
您使用的列值是 float,它是一个数字而不是 varchar。但是你输入 varchar = "15.50Am".
您可以为单位(am、kg 等)创建新列
或者您可以更改值,例如值数值 (5,2)
我在 SQL Server 2012 上工作;构建动态查询时,出现此错误
Msg 8114, Level 16, State 5, Line 16
Error converting data type varchar to float
如何解决这个错误?
我基于 @Header
和 @column
以及 @Body
构建了一个动态查询。
@Header
表示header必须显示为headers.
@column
表示数据透视表列。
@Body
表示select查询数据。
CREATE TABLE #FinalTable
(
PART_ID nvarchar(50) ,
CompanyName nvarchar(50),
PartNumber nvarchar(50),
DKFeatureName nvarchar(100),
value float,
StatusId int,
DisplayOrder int,
splitFlag bit
)
INSERT INTO #FinalTable
VALUES
('1222', 'Honda', 'silicon', 'package', '15.50Am', 2, 5, 0),
('1900', 'MERCEIS', 'GLASS', 'family', '90.00Am', 2, 2, 1),--have column per Unit on @Header because FlagAllow=1
('5000', 'TOYOTA', 'alominia', 'source', '70.20kg', 2, 1, 0),
('8000', 'MACDA', 'motor', 'parametric', '50.40kg', 2, 3, 1),--have column per Unit on @Header because FlagAllow=1
('8900', 'JEB', 'mirror', 'noparametric', '75.35kg', 2, 4, 0)
DECLARE @Header NVARCHAR(MAX)
SELECT
@Header = STUFF((SELECT ', ' + CASE WHEN A.splitFlag = 1 AND a.value <> '-' AND (a.Value IS NOT NULL) THEN '''' + A.DKFeatureName + ''' AS '' '+ A.DKFeatureName + ''', ''' + A.DKFeatureName + 'Units' + ''' AS ''' + A.DKFeatureName +'Units' +'''' else ''''+A.DKFeatureName +''' as ''' + A.DKFeatureName +'''' END
FROM #FinalTable A
WHERE StatusId = 2
ORDER BY DisplayOrder
FOR XML PATH ('')), 1, 2, '')
DECLARE @Columns NVARCHAR(MAX)
SELECT
@Columns = STUFF(
(
SELECT ', ' + case when A.splitFlag = 1 and a.value<> '-' and (a.Value is not null) then '['+A.DKFeatureName+'],['+A.DKFeatureName+'Unit]' else quotename(A.DKFeatureName) end
FROM #FinalTable A where StatusId=2
ORDER BY DisplayOrder
FOR XML PATH ('')
),1,2,''
)
DECLARE @Body NVARCHAR(MAX)
SELECT
@Body = STUFF(
(
SELECT ', ' + case when A.splitFlag = 1 and a.value<> '-' and (a.Value is not null) then '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
FROM #FinalTable A
where StatusId=2
ORDER BY A.DisplayOrder
FOR XML PATH ('')
),1,2,''
)
DECLARE @SQL NVARCHAR(MAX)
select @SQL =CONCAT('
SELECT * Into #NewTable
FROM #FinalTable
PIVOT(max(Value) FOR DKFeatureName IN ('+@Columns+')) AS PVTTable
',
N' Select ''PART_ID'' as ''PART_ID'' ,''CompanyName'' as ''CompanyName'',''PartNumber'' as ''PartNumber'' , ' +@Header + '
union all
select PART_ID,CompanyName,PartNumber, ' +@Body + ' from #NewTable
')
EXEC (@SQL)
您使用的列值是 float,它是一个数字而不是 varchar。但是你输入 varchar = "15.50Am".
您可以为单位(am、kg 等)创建新列
或者您可以更改值,例如值数值 (5,2)