我有这个过程:
Create PROCEDURE [dbo].[myProc]
@TableName nvarchar(100),
@RowID int
AS
BEGIN
SET @SQLQuery = 'Select * from ' + @TableName + ' where ID = ' + @RowID ;
EXECUTE(@SQLQuery);
END
我基本上想从这里返回结果行,没有where子句,一切都很好。
答案 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