2016-07-14 49 views
0

enter image description here我試圖從名爲NOTE_DESC的列中去除數字。如果字符有數字,則應填充SPECIAL列。如果沒有其他的JUNK列應該有特殊字符,我想擦洗。但是,我得到一個變量,顯示爲與NOTE_DESC相同的SPECIAL,並且JUNK列爲空或爲空。SQL從SQL結果中的自由文本中刪除字符

IF OBJECT_ID('tempdb.dbo.#DUPE_SUSPECT', 'U') IS NOT NULL 
    DROP TABLE #DUPE_SUSPECT 

SELECT 
    ROW_NUMBER() OVER (ORDER BY CAST(NOTE_DESC AS varchar)) AS ROW_NUM, 
    [NOTE_ID], 
    CAST([NOTE_DESC] AS varchar) [NOTE_DESC], 
    CASE 
    WHEN CHARINDEX('PEND KEY', CAST([NOTE_DESC] AS varchar)) > 0 THEN SUBSTRING(CAST([NOTE_DESC] AS varchar), CHARINDEX('PEND KEY', CAST([NOTE_DESC] AS varchar)), 24) 
    WHEN CHARINDEX('"MACESS WORK ITEM(S):', CAST([NOTE_DESC] AS varchar)) > 0 THEN SUBSTRING(CAST([NOTE_DESC] AS varchar), CHARINDEX('"MACESS WORK ITEM(S):', CAST([NOTE_DESC] AS varchar)), 38) 
    WHEN LEFT(CAST([NOTE_DESC] AS varchar), 2) = 'PK' THEN LEFT(CAST([NOTE_DESC] AS varchar), 18) 
    WHEN LEFT(CAST([NOTE_DESC] AS varchar), 1) NOT LIKE '%[A-Z]%' AND 
     LEFT(CAST([NOTE_DESC] AS varchar), 1) NOT IN ('...', ',,:', ':', '.', '!', ',', '?') THEN LEFT(CAST([NOTE_DESC] AS varchar), 18) 
    ELSE '' 
    END [SPECIAL], 
    [CREATED_BY_ID], 
    [CREATED_TIMESTAMP], 
    [CREATED_TEAM_ID], 
    [SERV_CCP_INQ_KEY], 
    [ACTION_TIMESTAMP] INTO #DUPE_SUSPECT 
FROM [dbo].[Staging_CCP_SERVICE_INQ_NOTES] 
WHERE CREATED_TIMESTAMP IS NOT NULL 

ALTER TABLE #DUPE_SUSPECT 
ADD JUNK varchar(max) NULL 

SELECT 
    * 
FROM #DUPE_SUSPECT 
ORDER BY ROW_NUM 

-- Create the variables used in parsing the string 

DECLARE @count int, 
     @position int, 
     @strText char(5000), 
     @row_num int, 
     @x int, 
     @pend_key char(20), 
     @character char(1), 
     @junk char(5000); 

-- Initialize the variables. 
SET @count = 100 
SET @row_num = 1 
SET @position = 1; 

WHILE @row_num < @count 
BEGIN 
    SET @strText = (SELECT 
    [NOTE_DESC] 
    FROM #DUPE_SUSPECT 
    WHERE ROW_NUM = @row_num) 

    WHILE @position < LEN(@strText) 
    BEGIN 
    SET @character = SUBSTRING(@strText, @position, 1) 
    IF @character IN ('1', '2', '3', '4', '5', '6', '7', '8', '9') 
    BEGIN 
     SET @pend_key = @pend_key + @character 
    END 
    ELSE 
    BEGIN 
     SET @junk = @junk + @character 

    END 
    SET @position = @position + 1 
    END 
    UPDATE #DUPE_SUSPECT 
    SET SPECIAL = @pend_key, 
     JUNK = @junk 
    WHERE ROW_NUM = @row_num 
    SET @row_num = @row_num + 1 
    SET @position = 1 
    SET @pend_key = '' 
END 
+1

請提供樣本數據。 – Tyron78

+0

所有行都填充,但JUNK除外,特殊行將填充 – lance9877

回答

0

這幾乎是不可能制定出你的代碼是沒有樣品的數據和表結構做什麼,但我可以看到在WHILE循環位的碼數(可能的)問題。

  1. @pend_key和@junk被聲明爲固定長度的字符,所以你的代碼添加到他們不會有任何效果(字符被填充到其全長的,所以無論你追加溢出)。
  2. 在任何情況下,它們都以NULL值開始,所以無論如何您都無法將它們附加到初始化之前。

因此改變他們的聲明,並初始化它們爲空字符串,像這樣:

DECLARE @pend_key varchar(20), 
     @junk varchar(5000); 

SET @pend_key = '' 
SET @junk = '' 

如果你使用SQL Server 2008 +你可以聲明和一個初始化,例如DECLARE @pend_key varchar(20) = '';

  • 你遍歷@strText變量可能是高達5000個字符長,但附加編號,以@pend_key這是隻有20個字符長。這可能是一個錯誤,至少是對時間的極大浪費。

  • 在循環結束時,您爲下一行重置@pend_key的值,但不要對@junk執行相同的操作,因此它將繼續填充前一行中的字符(至少直到它獲取到5000長)。我懷疑你打算這麼做。

  • 試着解決這些問題,你的代碼可能會更好 - 如我所說,如果沒有樣本數據就很難說!

    在任何情況下,一個接一個地循環訪問數據字符,都是非常低效的,除非您的數據集很小,否則將永遠持續下去。

    幾乎可以肯定有更好的方法來做你想做的事情。

    +0

    我添加了示例數據 – lance9877

    +0

    問題是,該字段NOTE_DESC是免費測試所以我必須經過並找到我正在查找的內容 – lance9877

    +0

    如果您按照我的建議改變你的聲明和初始化? – beercohol