2017-02-24 71 views
0

我自學T-SQL,所以我確信我可以在編寫代碼時獲得高效率,因此即使與此特定問題無關,也歡迎任何指針。在T-SQL腳本中檢查錯誤

我在寫夜間例程時遇到問題。創建初始數據的數據庫程序超出了我的控制範圍,而且編寫鬆散,所以我有不良數據可能會不時地炸燬我的腳本。我正在尋找幫助,將錯誤檢查添加到我的腳本中,因此我失去了一條記錄,而不是整個事情被炸燬。

的代碼看起來是這樣的:

SELECT convert(bigint,(SUBSTRING(pin, 1, 2)+ SUBSTRING(pin, 3, 4)+ SUBSTRING(pin, 7, 5) + SUBSTRING(pin, 13, 3))) AS PARCEL, taxyear, subdivisn, township, propclass, paddress1, paddress2, pcity 

    INTO [ASSESS].[dbo].[vpams_temp] 

    FROM [ASSESS].[dbo].[Property] 

    WHERE parcelstat='F' 

    GO 

的問題是在此第一部分,其中所述級聯發生。我試圖將這個字符串(11-1111-11111.000)轉換成這個數字(11111111111000)。如果他們正確地輸入了他們的數據,那麼在正確的位置上正確的點和數字就會有標點符號。如果他們犯了一個錯誤,那麼我會在錯誤的地方出現標點符號,並創建一個不能轉換爲數字的字符串。

+0

我的建議是將字符串放入臨時表中。然後擺脫連字符和句點。最後,只使用那些整數的字符串。 –

回答

1

首先,我會用replace()(兩次)。其次,我會用try_convert()

SELECT try_convert(bigint, 
        replace(replace(pin, '-', ''), '.', '') 
       ) as PARCEL, 
     taxyear, subdivisn, township, propclass, paddress1, paddress2, pcity 
INTO [ASSESS].[dbo].[vpams_temp] 
FROM [ASSESS].[dbo].[Property] 
WHERE parcelstat = 'F' ; 

你可能要檢查是否有值其他字符:

select pin 
from [ASSESS].[dbo].[Property] 
where pin like '%[^-0-9.]%'; 
+0

我絕對喜歡「try_convert」部分。這正是我所期待的。我認爲。如果使用try_convert發現不符合的數據,這種行爲是什麼? –

+1

@MattSyvertson如果該記錄的轉換失敗,try-convert會返回NULL,並繼續執行。因此,它可以讓您轉換所有可以轉換的值,而不會在執行過程中導致致命錯誤。 – scsimon

2

如何簡單地替換「 - 」和「。」用「」之前CONVERTBIGINT

要做到這一點,你只會用

SELECT CONVERT(BIGINT,REPLACE(REPLACE(pin,"-",""), ".","")) AS PARCEL, ... 

希望它可以幫助你更換的部分代碼。

+0

這聽起來很合理,代碼看起來如何?如果解決了這個問題,我很樂意實現這一點。此外,我還有其他的連接問題,這不會解決,並且仍然想知道是否有方法來檢查數據是否符合要求。在C#和其他語言中,可以逐行閱讀,「TRY」插入該行,如果不符合,則拒絕該行。 –

+0

您的谷歌搜索字符串是'sql server replace.' –

+0

已編輯,請嘗試編碼 –

0

爲什麼不乾脆:

select cast(replace(replace('11-1111-11111.000','-',''),'.','') as bigint) 
0

簡單地說,使用下面的代碼: -

declare @var varchar(100) 
set @var = '11-1111-11111.000' 
select convert(bigint, replace(replace(@var,'-',''),'.','')) 

結果: -

11111111111000