2012-04-30 73 views
1

我已經創建了一個存儲過程來將IP地址分成四個不同的列。爲什麼在將參數傳遞給存儲過程時出現錯誤?

ALTER PROCEDURE ipaddress_split 
(
    @str as varchar(max) 
) 
AS 
BEGIN 
    SET NOCOUNT ON 

    DECLARE @query as varchar(max) 
    SET @query = 'SELECT parsename('[email protected]+',4) as A 
         , parsename('[email protected]+',3) as B 
         , parsename('[email protected]+',2) as C 
         , parsename('[email protected]+',1) as D'; 
    EXEC (@query) 
    SET NOCOUNT off 
END 

但是,當我傳遞參數時出現錯誤。

EXEC ipaddress_split @str='191.168.1.1' 

Msg 102, Level 15, State 1, Line 1 
Incorrect syntax near '.1'. 

我嘗試了所有下面提到的組合,但沒有成功。

exec ipaddress_split '191.168.1.1' 
exec ipaddress_split 191.168.1.1 
exec ipaddress_split ('191.168.1.1') 

將參數傳遞給存儲過程的正確方法是什麼?

+1

是否有任何特別的原因使用動態SQL,特別是在這[可怕的形式](http://stackoverflow.com/search?q=sql+injection)? – GSerg

回答

6

您不必動態生成查詢來分割IP地址輸入。你可以做這樣的事情。

存儲過程腳本

ALTER PROCEDURE ipaddress_split 
(
    @str AS VARCHAR(max) 
) 
AS 
BEGIN 

SET NOCOUNT ON 

SELECT PARSENAME(@str, 4) AS A 
    , PARSENAME(@str, 2) AS B 
    , PARSENAME(@str, 3) AS C 
    , PARSENAME(@str, 1) AS D 

SET NOCOUNT OFF 

END; 

執行語句

EXEC ipaddress_split @str = '191.168.1.1'; 

輸出

A B C D 
--- --- --- --- 
191 1 168 1 

您的問題的原因:

您的動態查詢評估爲以下格式。它不會將PARSENAME函數的輸入視爲字符串。

SELECT parsename(191.168.1.1,4) as A,parsename(191.168.1.1,3) 
as B,parsename(191.168.1.1,2) as C,parsename(191.168.1.1,1) as D 

您必須更改設置的查詢語句通過包括每個單引號另外兩個單引號的查詢顯示給喜歡這樣。然後

set @query = 'SELECT parsename('''[email protected]+''',4) as A,parsename('''[email protected]+''',3) 
as B,parsename('''[email protected]+''',2) as C,parsename('''[email protected]+''',1) as D'; 

您的動態查詢會變成這個樣子

SELECT parsename('191.168.1.1',4) as A,parsename('191.168.1.1',3) as 
B,parsename('191.168.1.1',2) as C,parsename('191.168.1.1',1) as D 

我不建議這樣做反正你的方式。這不是正確的做法。

+1

是的,它適用於你的程序,但爲什麼我的程序無法傳遞參數。 –

+1

不需要恢復'nocount'。存儲過程中的'SET'被限制在該過程中並自動恢復。 – GSerg

+1

「PARSENAME」功能不錯的替代使用! – domager

1
set @query = 'SELECT PARSENAME('''[email protected]+''',4) as A ,PARSENAME('''[email protected]+''',3) as B,PARSENAME('''[email protected]+''',2) as C,PARSENAME('''[email protected]+''',1) as D' 
EXEC (@query) 

試試這個。它應該工作。

否則,通參數一樣,

exec ipaddress_split @str='''191.168.1.1''' 

在你的情況,當你執行查詢沒有找到該IP爲string

相關問題