将SQL CAST与从数据库中检索的转换类型一起使用

时间:2013-02-22 17:33:28

标签: sql sql-server casting sql-server-2012 varchar

只是想知道这是否可能,如果是这样......怎么样?

表格( Foos ):

Column   Value
Id       int pk autoinc
Type     varchar(50) not null
Name     varchar(50) not null
Value    varchar(50)

当我执行SELECT * FROM Foos时,我得到以下内容:

Id       Type          Name         Value
-------------------------------------------------
1        int           MaxScore     '100'
2        varchar(50)   Greeting     'hello world'
3        datetime      FollowupDate '01-01-2012'

我希望能够创建一个返回记录的SP(使用Id)并在返回之前将记录转换为适当的类型。我知道我可以很容易地按原样返回记录并使用应用程序将字符串转换为适当的类型...但我想这只是为了知道这是否有可能扩展知识并探索...沿着以下几行:

SELECT Id, Name, CAST(Value AS [Type]) 
FROM Foos

但是,我收到了错误:

  

Msg 243,Level 16,State 1,Line 1
  类型类型不是已定义的系统类型。

2 个答案:

答案 0 :(得分:1)

我确定你可以使用动态SQL来做到这一点,但我不认为它会特别优雅。您是否考虑过将值存储为sql_variant

答案 1 :(得分:0)

这样的事情可能会给你你应得的东西:

declare @Samples as Table ( Id Int Identity, Type VarChar(32), Name VarChar(32), Value VarChar(32) )
insert into @Samples ( Type, Name, Value ) values
  ( 'int',         'MaxScore',     '100' ),
  ( 'varchar(50)', 'Greeting',     'hello world' ),
  ( 'datetime',    'FollowupDate', '01-01-2012' ),
  ( 'money',       'PriceEach',    '99.4' )

select Id, Name, Type, Value, case
  when Type = 'DateTime' then Cast( Convert( DateTime, Value, 104 ) as SQL_Variant )
  when Type = 'Int' then Cast( Cast( Value as Int ) as SQL_Variant )
  when Type = 'Money' then Cast( Cast( Value as Money ) as SQL_Variant )
  when Type like 'VarChar(%)' then Cast( Cast( Value as VarChar(8000) ) as SQL_Variant )
  else NULL end Variant
  from @Samples

VarChar案例应该有额外的代码来解析长度,并使用SUBSTRING()来返回合适的长度。

愿你的灵魂怜悯你。