2016-07-26 16 views
0

我目前正在開發一個項目,其中客戶端需要有一個字段,在這種情況下,城市狀態和郵政區域在視圖中分爲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號線 無效的長度參數傳遞給左或子字符串函數。

+1

您將需要調試您的代碼。首先嚐試瞭解什麼參數left/right,substring需要。然後檢查您的代碼,看看您是否傳遞任何無效參數,它也很難爲我們調試,因爲沒有需要測試的實際數據 – TheGameiswar

+0

當向變量獲取數據時,我會推薦使用'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))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 –

回答

0

您只是將表VI_USER_UPS_TRACK_2中發生的最後一行讀取到變量@address中,並基於該值轉到不同的路徑。我會假設你的表中有更多的行,所以你的邏輯根本不起作用。

您需要編寫一個case語句來檢查您正在處理的單個行並根據該行進行數據處理。

另外,@address是過程的輸入參數,但是您會在過程的開始處覆蓋該值。

+0

我試圖在原始視圖代碼中執行此操作,我得到了相同的錯誤消息。示例: –

+0

示例在哪裏?您在問題的評論中發佈的代碼是完全錯誤的。您需要一個case語句來決定從哪個地址字段獲取數據。 –

+0

感謝您的意見。我仍然在學習T-SQL的高級方面,而且我的經驗比我更有經驗的同事也看到了與Case Select合作的觀點。我不知道爲什麼我粘貼的例子沒有顯示出來。如果其他人需要處理類似的項目,我將在Answers選項中發佈工作代碼。 –