0

これが可能かどうか疑問に思っています。

テーブル ( 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'

(Id を使用して) レコードを返す SP を作成し、レコードを返す前に適切な型にキャストできるようにしたいと考えています。レコードをそのまま返し、アプリケーションを使用して文字列を適切な型にキャストするだけで簡単にできることはわかっています...しかし、これは知識を広げて探索することが可能かどうかを知るためのものだと思います...次の行:

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

しかし、私はエラーが発生します:

メッセージ 243、レベル 16、状態 1、行 1
タイプ タイプは定義済みのシステム タイプではありません。

4

2 に答える 2

1

動的 SQL を使用してこれを行うことができると確信していますが、特に洗練されているとは思いません。値をsql_variantとして保存することを検討しましたか?

于 2013-02-22T17:38:35.193 に答える
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()、適切な長さを返すために使用する追加のコードが必要です。

犬があなたの魂を憐れんでくださいますように。

于 2013-02-22T19:01:31.287 に答える