私は現在、クライアントが単一のフィールドを必要とするプロジェクトで作業しています。この場合は、都市の州と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関数に渡されます。
あなたはあなたのコードをデバッグする必要があります。最初に左/右、部分文字列take.Thenあなたが無効なパラメータを渡しているかどうかを確認するには、テストする実際のデータ – TheGameiswar
データを変数に取り込むときに 'update'ではなく' select'を使うことをお勧めします。 updateを使用すると、実際にテーブルを更新していないので、もっと混乱します。 –
このビューコードは、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 –