动态SQL - 使用where子句

时间:2010-12-14 11:30:05

标签: sql

我有这个过程:

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

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

我基本上想从这里返回结果行,没有where子句,一切都很好。

2 个答案:

答案 0 :(得分: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 :(得分: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