我目前正在開發一個項目,其中客戶端需要有一個字段,在這種情況下,城市狀態和郵政區域在視圖中分爲3個單獨的字段。我確實找到了這樣做的代碼,但是我遇到的問題是,城市狀態和zip數據並不總是在同一列中。有時它位於shp_to_addr_2列中,有時位於shp_to_addr_3列中。解析出可能不在一列中的地址數據
代碼最終會拋出一個參數錯誤,因爲它有時會以傳遞給它的空值結束。我曾嘗試使用變量來捕捉列中的數據,但仍然以這個討厭的錯誤結束。以下是我設置爲存儲過程的代碼,並顯示錯誤消息。我究竟做錯了什麼?
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/right,substring需要。然後檢查您的代碼,看看您是否傳遞任何無效參數,它也很難爲我們調試,因爲沒有需要測試的實際數據 – TheGameiswar
當向變量獲取數據時,我會推薦使用'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))AS市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郵編 FROM VI_USER_UPS_TRACK_2 –