动态SQL—与where子句有关的内容
我有这个程序:动态SQL—与where子句有关的内容,sql,Sql,我有这个程序: Create PROCEDURE [dbo].[myProc] @TableName nvarchar(100), @RowID int AS BEGIN SET @SQLQuery = 'Select * from ' + @TableName + ' where ID = ' + @RowID ; EXECUTE(@SQLQuery); END 基本上,我想从中返回结果行,没有where子句,这一切都很好。如果ID是varchar,请尝试以下操作:
Create PROCEDURE [dbo].[myProc]
@TableName nvarchar(100),
@RowID int
AS
BEGIN
SET @SQLQuery = 'Select * from ' + @TableName + ' where ID = ' + @RowID ;
EXECUTE(@SQLQuery);
END
基本上,我想从中返回结果行,没有where子句,这一切都很好。如果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
您需要非常小心,因为您已经向SQL注入攻击敞开了大门。我强烈建议在这方面要非常谨慎,并尽可能地进行参数化。e、 g
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之前检查白名单。正确地查找您想要做的事情(不管SQL注入漏洞如何)。什么不起作用?如果我去掉where子句,我会得到结果。但是,在I get:Conversion中使用where子句时,将nvarchar值“Select*from[TableName]where ID=”转换为数据类型int时失败。添加一个print@SQLQuery,您可以运行生成的查询并检查它是否返回rows@JL-将
INT
转换为字符串CONVERT(@RowID AS VARCHAR)
谢谢Ada,工作起来很有魅力,我决定用你的方式来阻止SQL注入。