2016-07-26 1 views
0

私は現在、クライアントが単一のフィールドを必要とするプロジェクトで作業しています。この場合は、都市の州とZIPフィールドがビュー内の3つの別々のフィールドに分割されます。私はこれをうまくやっているコードを見つけましたが、私が問題になっているのは、都市の州とジップのデータが常に同じ列にあるとは限りません。場合によってはshp_to_addr_2列にあり、時にはshp_to_addr_3列にあることもあります。1つの列にないかもしれないアドレスデータの解析

コードは、時折null値が渡されて終了するため、パラメータエラーをスローします。私は変数を使用して列をデータにキャッチしようとしましたが、この厄介なエラーに終わります。ここでは、エラーメッセージと共にストアドプロシージャとして設定したコードを示します。私は間違って何をしていますか?

USE [database] 
GO 

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

CREATE PROCEDURE [dbo].[USER_SP_VI_USER_UPS_TRACK_2] 

@address VARCHAR(50) = NULL 

AS 
SET NOCOUNT ON 

BEGIN 
    UPDATE VI_USER_UPS_TRACK_2 
    SET @address = shp_to_addr_3 

    IF @address IS NULL 
    SELECT ord_no, cust_no, ord_dat, shp_to_nam, shp_to_addr_1, shp_to_addr_2, shp_to_addr_3, ord_typ, 
    (LEFT(shp_to_addr_2, CHARINDEX(',', shp_to_addr_2) - 1)) AS City, LEFT(LTRIM(SUBSTRING(shp_to_addr_2, 
    CHARINDEX(',', shp_to_addr_2) + 1, 4)), 2) AS ST, RIGHT(RTRIM(shp_to_addr_2), CHARINDEX(' ', REVERSE 
    (RTRIM(shp_to_addr_2))) - 1) AS Zip 
    FROM VI_USER_UPS_TRACK_2 

    ELSE IF @address IS NOT NULL 

    SELECT ord_no, cust_no, ord_dat, shp_to_nam, shp_to_addr_1, shp_to_addr_2, shp_to_addr_3, ord_typ, 
    (LEFT(shp_to_addr_3, CHARINDEX(',', shp_to_addr_3) - 1)) AS City, LEFT(LTRIM(SUBSTRING(shp_to_addr_3, 
    CHARINDEX(',', shp_to_addr_3) + 1, 4)), 2) AS ST, RIGHT(RTRIM(shp_to_addr_3), CHARINDEX(' ', REVERSE 
    (RTRIM(shp_to_addr_3))) - 1) AS Zip 
    FROM VI_USER_UPS_TRACK_2 
END 

手順はコンパイルが、実行されたときに、私はこれを取得:

メッセージ537、レベル16、状態2、手順USER_SP_VI_USER_UPS_TRACK_2、ライン13 無効な長さのパラメータLEFTまたはSUBSTRING関数に渡されます。

+1

あなたはあなたのコードをデバッグする必要があります。最初に左/右、部分文字列take.Thenあなたが無効なパラメータを渡しているかどうかを確認するには、テストする実際のデータ – TheGameiswar

+0

データを変数に取り込むときに 'update'ではなく' select'を使うことをお勧めします。 updateを使用すると、実際にテーブルを更新していないので、もっと混乱します。 –

+0

このビューコードは、shp_to_addr_3のデータが、他の列のshp_to_addr_2にあるときにエラーになります。 SELECT ord_no、CUST_NO、ord_dat、shp_to_nam、shp_to_addr_1、shp_to_addr_2、shp_to_addr_3、ord_typ、 (LEFT(shp_to_addr_3、CHARINDEX( ''、shp_to_addr_3) - 1))市、LEFT(LTRIM AS(SUBSTRING(shp_to_addr_3、 CHARINDEX (RTRIM(shp_to_addr_3)))) - 1)AS Zip FROM VI_USER_UPS_TRACK_2 –

答えて

0

あなただけの変数@addressにテーブルVI_USER_UPS_TRACK_2から来て、あなたは別の道に行くことに基づいて、たまたま最後の行をフェッチしています。あなたのテーブルにはもっと多くの行があると仮定して、あなたのロジックはまったく動作しません。

処理している個々の行をチェックし、それに基づいてデータを取得するcase文を記述する必要があります。

また、@addressはプロシージャの入力パラメータですが、プロシージャの最初に値を上書きします。

+0

I(1)元のビューコードでこれをやろうとしましたが、私は同じエラーメッセージを受け取りました。ここの例: –

+0

例はどこですか?質問にコメントで投稿したコードは完全に間違っています。どのアドレスフィールドからデータを取得するかを決定するには、case文が必要です。 –

+0

ありがとうございます。私はまだT-SQLの先進的な側面を学んでいます。私よりも経験豊富な同僚がCase Selectで作業するという視点を持っています。私が貼り付けたサンプルがなぜ表示されなかったのか分かりません。他の人が同様のプロジェクトで作業する必要がある場合は、Answersオプションに作業コードを掲載します。 –

関連する問題