只是想知道这是否可能,如果是这样......怎么样?
表格( 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
类型类型不是已定义的系统类型。
答案 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()
来返回合适的长度。