2010-03-03 40 views
0

我想寫的Visual Studio的TableAdapter查詢嚮導SQL查詢嚮導

我的SQL查詢中的SQL查詢:

DECLARE @SQL varchar(255); 

SET @SQL = ' SELECT * FROM dbAddress WHERE 1 = 1' 

IF @ApexLine1 = '' 
    BEGIN 
     SET @SQL = @SQL + ' AND addLine1 IS NULL ' 
    END 
ELSE 
    BEGIN 
     SET @SQL = @SQL + ' AND addLine1 = ''' + @ApexLine1 + '''' 
    END 

IF @ApexLine2 = '' 
    BEGIN 
     SET @SQL = @SQL + ' AND addLine2 IS NULL ' 
    END 
ELSE 
    BEGIN 
     SET @SQL = @SQL + ' AND addLine2 = ''' + @ApexLine2 + '''' 
    END 

IF @ApexLine3 = '' 
    BEGIN 
     SET @SQL = @SQL + ' AND addLine3 IS NULL ' 
    END 
ELSE 
    BEGIN 
     SET @SQL = @SQL + ' AND addLine3 = ''' + @ApexLine3 + '''' 
    END 

IF @ApexZip = '' 
    BEGIN 
     SET @SQL = @SQL + ' AND addPostCode IS NULL ' 
    END 
ELSE 
    BEGIN 
     SET @SQL = @SQL + ' AND addPostCode = ''' + @ApexZip + '''' 
    END 

IF @ApexCity = '' 
    BEGIN 
     SET @SQL = @SQL + ' AND addLine4 IS NULL ' 
    END 
ELSE 
    BEGIN 
     SET @SQL = @SQL + ' AND addLine4 = ''' + @ApexCity + '''' 
    END 

IF @ApexProv = '' 
    BEGIN 
     SET @SQL = @SQL + ' AND addLine5 IS NULL ' 
    END 
ELSE 
    BEGIN 
     SET @SQL = @SQL + ' AND addLine5 = ''' + @ApexProv + '''' 
    END 

EXEC(@SQL) 

我得到的錯誤:

'聲明SQL構造或聲明不被支持'

如果我刪除了Declare語句,我得到錯誤:

'Set SQL構造或語句不受支持'

是否有解決此問題的方法?

謝謝。

+0

NeverNEVER **絕不**構建這樣的查詢字符串。 – 2010-03-03 14:21:23

回答

3

這樣的事:

SET @SQL = @SQL + ' AND addLine1 = ''' + @ApexLine1 + '''' 

EVIL。不要這樣做。如@ ApexLine1可能包含什麼,即使是這樣的變量:

';DROP TABLE dbAddress--

非常仔細地瞭解,如果有人在你的地址1個字段中輸入這樣的事情會發生什麼想法。唯一正確的解決方案是使用內置的sp_executesql存儲過程。學習它,使用它。

除此之外,我認爲你的問題的至少一部分可能是你的@SQL變量只有255個字符。很容易您的查詢耗盡空間。

+0

我不擔心SQL注入問題,因爲參數不是從文本框或任何東西獲取的。他們被從後面的代碼中的另一個數據庫中拉出來。另外,這是一個本地內部網應用程序,我們公司以外沒有人可以訪問。這只是一個測試查詢,255個字符在工作後會被解除,但這不是問題。 – Hunter 2010-03-03 14:38:04

+1

無論他們是否從另一個數據庫中提取都無關緊要。這仍然是一個注射風險(二階注射),因爲_that_數據庫可能是手工填充的。而「本地內聯網」絕不是理由 - 大多數攻擊都是在內部工作。即使這些是有效的藉口,爲什麼不這樣做呢?這並不難。你對這個查詢所做的只是簡單**錯誤**。 – 2010-03-03 14:54:15

+1

拿了點。我會採取必要的措施來解決。謝謝。 – Hunter 2010-03-03 15:33:25