Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
动态SQL—与where子句有关的内容_Sql - Fatal编程技术网

动态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注入。