在CASE语句中使用CAST时的数据转换错误

Joe*_*ggs 5 sql t-sql sql-server sql-server-2008

运行以下时,我收到错误'错误将数据类型nvarchar转换为浮动'

     declare 
     @completeCommand       nvarchar (max) = 'x'
    ,@paramVal              nvarchar (100)
    ,@paramName             nvarchar (100)
    ,@paramType             nvarchar (100)
    ,@tempParam             sql_variant

  declare @parameterList table (
      RowID           int identity (1,1)
     ,ParameterValue  nvarchar (100)
     ,ParameterName   nvarchar (100)
     ,ParameterType   nvarchar (100)
  )

  insert into @parameterList
  values
     ('10', 'Param1', 'int')
    ,('test', 'Param2', 'nvarchar')

  -- Process each parameter one at a time
  declare ParameterCursor cursor fast_forward for
    select ParameterValue, ParameterName, ParameterType
    from @parameterList
    order by RowID

  open ParameterCursor

  fetch next from ParameterCursor into @paramVal, @paramName, @paramType

  if @@FETCH_STATUS = 0
    set @completeCommand = @completeCommand + ' '

  while @@FETCH_STATUS = 0
  begin

    print @completeCommand

    -- verify the datatype is correct
    set @tempParam = case @paramType
          when 'int' then CAST (@paramVal as int)
          when 'float' then CAST (@paramVal as float)
          when 'nvarchar' then CAST (@paramVal as nvarchar)
          else 'NULL'
        end 

    set @completeCommand = @completeCommand + @paramName + ' = ' + @paramVal + ','

    fetch next from ParameterCursor into @paramVal, @paramName, @paramType
  end

  close ParameterCurosr
  deallocate ParameterCursor
Run Code Online (Sandbox Code Playgroud)

我要做的是在将数据添加到命令字符串之前验证用户输入的数据是否与预期的数据类型匹配.任何有关上述代码失败原因的反馈都将非常感激.

干杯,乔

KM.*_*KM. 6

问题是CASE将返回具有最高预测的数据类型,该语句的浮点数为float.请参阅CASE(Transact-SQL)数据类型优先级(Transact-SQL).

CASE使其工作,请添加一个伪造WHEN 'xzy' then CAST (@paramVal as sql_variant),这将导致CASE使用sql_variant作为返回数据类型.

或删除CASE并使用IF-ELSE,如:

IF @paramType='int'
    set @tempParam = CAST (@paramVal as int)
ELSE IF @paramType='float'
    set @tempParam = CAST (@paramVal as float)
ELSE IF @paramType='nvarchar'
    set @tempParam = CAST (@paramVal as nvarchar)
ELSE 
    set @tempParam = NULL
Run Code Online (Sandbox Code Playgroud)