2009-06-21 43 views
2

這裏是我的Storprocedure傳遞一個WHERE條件到存儲過程

CREATE PROCEDURE [B] 

@BoardID varchar(5000) 

AS 

declare @sB varchar(8000) 
set @sB= ' ' 


Select name,id,address from BoardDetail 

WHere IsActive=1 and @[email protected] 
GO 

這裏我送字符串參數....我@BoardID包含字符串條件,如:名=一和id = 5地址= adfas

,我希望對剛剛串並要設置在身邊任何一個可以幫助我修正這個錯誤

回答

8

您需要構建一個動態查詢。

看到這篇文章:The Curse and Blessings of Dynamic SQL。這是動態SQL的規範參考。

正如其他人已經指出的那樣,您應該謹慎使用動態SQL,並且在沒有其他方法適用的情況下使用。動態SQL可以打開SQL注入攻擊的風險,正如「動態SQL的詛咒和祝福」中所指出的那樣,還有更多的細節需要注意。

+2

1對於Sommarskog參考 - 厄蘭是非常明亮的人。 – 2009-06-21 02:41:56

+0

@Aaron Alton:他當然是! – 2009-06-21 02:50:22

+1

+1使用像canonical這樣的偉大詞彙;-) – 2009-06-21 07:07:07

0

你在想它是錯的(好的沒有錯,但是從框架如何讓你工作)。

您試圖在SQL中傳遞參數作爲參數,然後將其附加到您擁有的SQL中。這可以使用dynamic SQL但不是沒有它 - 而且你沒有使用它。

什麼你從字面上做的是比較:

WHere IsActive=1 and @[email protected] 
becomes: 
WHere IsActive=1 and ' '='name=5 and id=6' 

將返回當然沒有結果,因爲一個空字符串不等於包含這些字符的字符串。

0

您正在嘗試檢查一個不存在的列

選擇姓名,ID,從BoardDetail地址

凡IsActive = 1,@ SB = @板卡ID

@sB是一個變量它永遠是NULL,永遠不會是= @BoardDetail

如果您嘗試根據參數@BoardDetail ='name = a和id = 5和address = adfas'發送的字符串值進行選擇,請嘗試以下操作:

CREATE PROCEDURE從[B]

@BoardID VARCHAR(5000)

AS

申報@cmd VARCHAR(8000)

SET @cmd =「選擇名稱,ID,地址BoardDetail其中IsActive = 1和「+ @BoardID

EXECUTE(@CMD)

拉吉

6

這是一個非常糟糕的做法。這將限制您驗證SQL參數的能力,減少或消除查詢計劃重用,並且可能會擴大臭氧層的空洞。

我在開玩笑說最後一個 - 不是前兩個。

你好得多剛剛創建三個參數:

CREATE PROCEDURE B 
    @name varchar(10), 
    @id int, 
    @address varchar(20) 
AS 
BEGIN 
    SELECT name, address FROM BoardDetail 
    WHERE IsActive = 1 AND BoardID = @id AND name = @name AND address = @address 
END 

信任我 - 通往地獄的路上滿是串聯查詢字符串。

1

你可以做到這一點使用動態SQL,用execsp_executesql

CREATE PROCEDURE [B] 
    @BoardWhere varchar(5000) 
AS 
declare @query varchar(8000) 
set @query = 'Select name,id,address from BoardDetail where ' + @BoardWhere 
exec (@query) 

這是給聲明存儲過程時模式名,鐵的最佳實踐:

CREATE PROCEDURE dbo.[B] 

而且,存儲過程是開放的SQL注入,所以要注意你給誰執行權利。例如,有人可以通過「1 = 1」作爲參數,甚至更糟糕的事情。

1

如果您希望在運行時傳遞多個搜索項,則可以這樣做,而不是使用動態SQl。如果可以避免,記住使用動態SQL通常是一個不好的做法。

SELECT * FROM MYTABLE 其中(添加my_id = @my_id OR @my_id IS NULL) 和(CLIENT_ID = @client_id或@client_id爲null)

相關問題