2013-12-14 20 views
0

我有一個存儲過程。我想追加參數以獲取特定表格中的所有數據(例如tblJanuary2014)。但格式是(可能)不正確?SQL Server存儲過程追加參數格式

ALTER PROCEDURE GetReportAsOf 
( 
    @Month varchar(15), 
    @Year varchar(15) 
) 
AS 
    BEGIN 
     SELECT * FROM [email protected]@Year 
    RETURN 
    END 

在執行過程中,它說:

無效的對象名稱TBL @月@年「這個

回答

3

您應該創建動態SQL。

ALTER PROCEDURE GetReportAsOf 
( 
    @Month varchar(15), 
    @Year varchar(15) 
) 
AS 
    BEGIN 
     DECLARE @SQLQuery AS NVARCHAR(500) 
     SET @SQLQuery = 'SELECT * FROM tbl' + @Month + @Year 
     EXECUTE(@SQLQuery) 
    RETURN 
    END 
+0

有人可以執行該SP從而:'EXEC GetReportAsOf @Month = '; DELETE表1',@年=';刪除表2'。 –

1

爲了避免SQL注入我會使用int參數

@y smallint, @m tinyint 

declare @sqlstatement nvarchar(max); 

set @sqlstatement = N'select ... from dbo.something' + convert(nvarchar(2), @m) + convert(nvarchar(4), @y); 

exec(@sqlstatement);