2016-07-05 19 views
0

VBAからストアドプロシージャを実行中に問題が発生しました。列名をパラメータの文字列として渡してから、case文を使用したいデータ内の実際の列名を選択します。動的列名をSQL Serverに渡すときのデータ型エラー

このクエリは、通過する列名(@FACTOR)が整数である場合にうまく機能しますが、varcharの場合は正しくありません。

データ型nvarcharをfloatに変換中にエラーが発生しました。以下の例では、より簡潔である

WITH T0 AS (
     SELECT DISTINCT 
     CASE @FACTOR 
      WHEN 'DRVREC' THEN DRIVINGRECORD --OK 
      WHEN 'POAGE' THEN POAGE 
      WHEN 'ANNUALKM' THEN AMC_VH_ANNL_KM 
      WHEN 'DAILYKM' THEN AMC_VH_KM_TO_WRK 
      WHEN 'RATETERR' THEN AMC_VH_RATE_TERR --OK 
      WHEN 'BROKERNAME' THEN MASTERBROKER_NAME 
      WHEN 'DRVCLASS' THEN DRIVINGCLASS -- OK 
      WHEN 'VEHAGE' THEN VEH_AGE -- OK 
      WHEN 'YEARSLIC' THEN YRSLICENSE 
      WHEN 'COVERAGECODE' THEN COVERAGECODE 
      ELSE NULL END AS FACTOR FROM DBO.Automation_Data 
     ), 
    ... 
    ... 

それとも:

は、ここに私のコードです

DECLARE @FACTOR varchar(50) 
SELECT @FACTOR = 'NOT_A_VARCHAR' 

SELECT CASE @FACTOR 
    WHEN 'A_VARCHAR' THEN COLUMNNAME1 
    WHEN 'NOT_A_VARCHAR' THEN COLUMNNAME2 
    ELSE NULL END AS FACTOR FROM dbo.myTable 

^これは動作しますが、@FACTOR = 'A_VARCHAR'ならば、私はエラーを取得します。

ありがとうございます!

UPDATE **********************************:

ように見えますケースステートメント自体の問題?

私のcase文にvarcharオプションしかない場合は、クエリが実行されます。ケースステートメントの2番目の部分をコメント解除するとエラーが表示されます。

+0

は、変換(すべての列の周りnvarchar型は、提案のための – artm

+0

感謝を選択ませ鋳物の量や変換が動作するように見えない私の更新を参照してください、入れてください – stobin

+0

あなたのコメントは実際には正しいです:私はそれが必要ではないと思ったので私がテストしていたときにすべてのケースの選択肢を変換していませんでした。大文字と小文字のオプションが選択されず、それでもNVARCHARに変換する必要があります。 – stobin

答えて

1

複数の列を1つの列として選択している場合、SQLは結果を最高の優先度の型として返します。複数のデータ型から単一の結果が返される場合は、同じように結合などが行われます。

たとえば、次のコードを試してみると、abcをint(より高い優先順位)に変換しようとすると、3番目の選択で取得したエラーが返されます。 @Vを'123'に設定すると、'123'からint/floatへの変換が機能するので、エラーはなくなります。結果の'BaseType'をチェックすると、混合型の中で最も優先度の高いデータ型が表示されます。あなたはNVARCHARにすべてのあなたの選択を変換する場合

DECLARE @F int = 1 --if you use float here error message will show ...'abc' to data type float. 
DECLARE @V varchar(5) = 'abc' 

DECLARE @O varchar = '1' 

SELECT CASE WHEN @O = '1' THEN @F ELSE @V END --no error 

SELECT SQL_VARIANT_PROPERTY((SELECT CASE WHEN @O = '1' THEN @F ELSE @V END), 'BaseType') --int/float 

SET @O = '2' 

SELECT CASE WHEN @O = '1' THEN @F ELSE @V END --error: Conversion failed when converting the varchar value 'abc' to data type int. 

は、nvarchar型は、最も優先順位の高いデータ型になりましたので、それが働きました。しかし、いくつかの列が浮動小数点であり、そのうちのいくつかがnvarcharであることが分かっている場合は、float列をnvarcharに変換するだけで済みます。だから、これは同様に動作します:。。

SET @O = '2' 
SELECT CASE WHEN @O = '1' THEN CONVERT(NVARCHAR(5), @F) ELSE @V END 

SQL Data Type Precedence

関連する問題