2016-09-04 3 views
0

を返す私は、SQL Server 2012を使用しています私は私のクエリRIGHT関数がエラー

SELECT * FROM table1 PC 
JOIN table2 t2 
ON PC.ID = t2.ID 
AND 
(
    RIGHT 
    (
    PC.C_PRODUCT_ID, 
    (DATALENGTH(PC.C_PRODUCT_ID) - (DATALENGTH(PC.C_PRODUCT_ID) - CHARINDEX(REVERSE('*'), 
    REVERSE(PC.C_PRODUCT_ID)))-1) 
) 
) = REPLACE(T2.COMP_PROD_ID,' ','') 

でこの文を持っており、それは誤り

メッセージ536、レベル16、状態4を、スローLine 2
無効な長さパラメータがRIGHT関数に渡されます。

私はいくつかの例をとり、RIGHT関数に正の値が渡されていることを確認しました。

C_PRODUCT_IDの例ここでは私の場合は

  • C_PRODUCT_ID C_PRODUCT_IDの= '3-12 * LV431536'
  • リバース=したがって '635134VL * 21-3'

、従っ上記の文に

26 – (26- 9) -1 
26- 17 -1 
9 -1 
8 

これは、LV431536のLIGHT(3-12 * LV431536,8)です。この値はT2.COMP_PROD_IDに存在する。

私の質問がはっきりしていて、今は保留にならないといいと思います。

+0

*を付けずに製品IDの例を試してみると、指定したエラーメッセージが表示されます。すべての商品IDに*文字が含まれていますか? –

+0

@CsabaBenkoはいすべてのC_PRODUCT_IDには必ず*が含まれています。 – Tanu

+0

次に、@ gbnにはおそらくUnicode文字列の良い点があると思います。 –

答えて

2

nvarcharを使用していますか?

そうであれば、DATALENGTHは

  • LEN

    と同じではないLENは除外スペース
  • DATALENGTHは、バイトをカウントする(基本的にディスク上spoace)

を末尾のスペースを含む後続文字をカウントだから、DATALENGTHはRIGHT

としてLEN in the docs

ごとに切断された= LENのdoubleを返します。

LENは末尾の空白を除外します。それが問題の場合は、文字列をトリミングしないDATALENGTH(Transact-SQL)関数の使用を検討してください。 Unicode文字列を処理する場合は、あなたの問題は、以下のような式が戻って、結果として、その場合には、文字列全体をあなたを与える*せずにデータ項目がある場合は、DATALENGTHは二回文字

+0

あなたはこの質問を見ることができると思いますか?http://stackoverflow.com/questions/40197865/mssql-is-there-any-performance-penalty-for-wrapping-a-select-query- in-a-transa – eddy

0

の数を返します。

DECLARE @prodId VARCHAR(255) = '3-12LV431536' 
SELECT 
(
    RIGHT 
    (
     @prodId, 
     (
      DATALENGTH(@prodId) - 
      (
       DATALENGTH(@prodId) - CASE 
            WHEN CHARINDEX(REVERSE('*'), REVERSE(@prodId)) = 0 
            THEN DATALENGTH(@prodId) + 1 
            ELSE CHARINDEX(REVERSE('*'), REVERSE(@prodId)) END 
      ) 
     -1) 
    ) 
)