2011-11-12 9 views
2

'CASE'を使用しているうちに、聞いたことがない問題が発生しました。
問題はそうです:フィールドとして 'SELECT'句の 'CASE'ステートメントを使用しています。 int型のデータ型を持つ列を呼び出すと成功です。ただし、varcharまたはdatetimeを呼び出すと、失敗します。
エラーの結果、「CASE」ステートメントを含むテンポラリフィールドをintとマークしたと言われていますが、そうではありません。 ...変換の失敗 'CASE'について

'ストアドプロシージャ' のコンテンツ

CREATE PROC spRegistry_PersonsGetField 
@ID int, 
@Field varchar(100) 
AS 
SELECT CASE @Field 
WHEN 'Name' THEN Name 
WHEN 'Surname' THEN Surname 
WHEN 'Username' THEN Username 
WHEN 'Password' THEN Password 
WHEN 'Status' THEN dbo.fnStatus(Status) 
WHEN 'EMail' THEN EMail 
WHEN 'Tel' THEN dbo.fnIsEmpty(Tel) 
WHEN 'Address' THEN dbo.fnIsEmpty(Address) 
WHEN 'City' THEN dbo.fnIsEmpty(City) 
WHEN 'BirthDate' THEN dbo.fnDate(BirthDate) 
WHEN 'Gender' THEN dbo.fnGender(Gender) 
WHEN 'Lang' THEN Lang 
ELSE NULL 
END 
AS [Alan] varchar(200) 
FROM Registry_Persons 
WHERE ID = @ID 

マイクエリ

EXEC spRegistry_PersonsGetField 1、 '誕生日'

エラーメッセージを助けてください

varchar値'04/11/2011 'をデータ型intに変換するときに変換に失敗しました。

+0

「名前」と言う別のパラメータを渡した場合、SPは機能しますか? 'dbo.fnDate'関数は間違いなく機能しますか? – ipr101

+0

その機能は正しく動作します – Mesut

答えて

6

T-SQLのPrecedenceのルールが適用されます。 intvarcharよりも高い優先順位を持っているので、intへの暗黙の変換が試みられた後、&が失敗します。

これを修正するには、intまたはdatetimeの式をvarcharに変換してください。

0

生年月日をVARCHARにキャスト/変換してみてください。このようなもの。 CASE単一返されるデータ型があることを何であるかを動作させるために評価されるとき

SELECT CASE @Field 
    WHEN 'Name' THEN Name 
    WHEN 'Surname' THEN Surname 
    WHEN 'Username' THEN Username 
    WHEN 'Password' THEN Password 
    WHEN 'Status' THEN dbo.fnStatus(Status) 
    WHEN 'EMail' THEN EMail 
    WHEN 'Tel' THEN dbo.fnIsEmpty(Tel) 
    WHEN 'Address' THEN dbo.fnIsEmpty(Address) 
    WHEN 'City' THEN dbo.fnIsEmpty(City) 
    WHEN 'BirthDate' THEN CAST(dbo.fnDate(BirthDate) AS VARCHAR) -- update here 
    WHEN 'Gender' THEN dbo.fnGender(Gender) 
    WHEN 'Lang' THEN Lang 
    ELSE NULL 
END AS [Alan] varchar(200) 
FROM Registry_Persons 
WHERE ID = @ID 
関連する問題