2010-12-14 63 views
0

我有這個PROC:動態SQL - 東西了where子句

Create PROCEDURE [dbo].[myProc] 
@TableName nvarchar(100), 
@RowID int 

AS 
BEGIN 
    SET @SQLQuery = 'Select * from ' + @TableName + ' where ID = ' + @RowID ; 
    EXECUTE(@SQLQuery); 
END 

我基本上是想從這個返回結果行,沒有WHERE子句,所有的好。

+1

看起來正確無誤(無論SQL注入漏洞如何)。什麼不工作? – Oded 2010-12-14 11:32:56

+0

如果我拿出where子句,我會得到結果。但是在我得到的where子句中:轉換nvarchar值'Select * from [TableName] where ID ='轉換爲數據類型int時轉換失敗。 – 2010-12-14 11:36:14

+0

添加打印@SQLQuery,您可以運行生成的查詢並檢查它是否返回行 – 2010-12-14 11:36:59

回答

2

你必須要非常小心,因爲你已經打開了自己的SQL注入攻擊。我強烈建議儘可能多地保持這個和參數。例如

Create PROCEDURE [dbo].[myProc] 
@TableName nvarchar(100), 
@RowID int 
AS 
BEGIN 
    DECLARE @SQLQuery NVARCHAR(500); 
    IF (OBJECT_ID(@TableName) IS NOT NULL) 
     BEGIN 
      SET @SQLQuery = 'Select * from ' + QUOTENAME(@TableName) + ' where ID = @RowId' 
      EXECUTE sp_executesql @SQLQuery, N'@RowId INTEGER', @RowID 
     END 
END 

這也將是值得考慮的「封鎖住」什麼@tablename值明確支持 - 覈對白名單建設/執行的動態SQL之前。

+1

感謝Ada,它像一個魅力,我決定用你的方式來防止SQL注入。 – 2010-12-14 11:44:54

0

的情況下ID爲varchar試試這個:

Create PROCEDURE [dbo].[myProc] 
@TableName nvarchar(100), 
@RowID int 

AS 
BEGIN 
    SET @SQLQuery = 'Select * from ' + @TableName + ' where ID = ''' + rtrim(ltrim(str(@RowID))) + ''''; 
    EXECUTE(@SQLQuery); 
END