You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中将表名与Schema名作为参数传入参数化SQL查询

现有写法错误原因

你当前的写法无法正常执行,因为 ADO.NET的SqlParameter仅支持参数化数据值,不支持参数化SQL结构标识符(包括库名、Schema名、表名、字段名)。直接把@Schema、@Table写在SQL语句中会被识别为普通字符串值,而非表结构标识符,执行时会抛出语法错误。同时你原SQL里多写了冗余的[dbo].[UserTypes]前缀,属于语法笔误也需要删除。


正确实现方案

有两种安全的实现方式,均可避免SQL注入风险:

方案1:白名单校验 + 标识符拼接(推荐)

先对输入的Schema、表名作白名单校验,确认是允许访问的对象后再拼接入SQL语句,业务数据依然使用参数化传入,代码示例如下:

// 预定义允许访问的Schema、表名白名单,可根据业务调整
var allowedSchemas = new List<string> { "dbo", "log", "config" };
var allowedTables = new List<string> { "UserTypes", "Orders", "Users" };

string inputSchema = "dbo";
string inputTable = "UserTypes";

// 校验不通过直接拦截
if (!allowedSchemas.Contains(inputSchema) || !allowedTables.Contains(inputTable))
{
    throw new ArgumentException("非法的Schema或表名");
}

// 拼接合法标识符到SQL,数据值保持参数化
string execSql = $@"INSERT INTO [{inputSchema}].[{inputTable}] ([Name],[Description]) VALUES(@NAME, @Description)";
db.Database.ExecuteSqlCommand(execSql,
    new SqlParameter("@NAME", "AA"),
    new SqlParameter("@Description", "Test"));

方案2:使用QUOTENAME转义标识符执行动态SQL

如果不方便维护白名单,可借助SQL Server内置的QUOTENAME函数对标识符做转义,再通过sp_executesql执行动态SQL,代码示例如下:

string execSql = @"
DECLARE @DynamicSql NVARCHAR(MAX);
SET @DynamicSql = N'INSERT INTO ' + QUOTENAME(@Schema) + N'.' + QUOTENAME(@Table) + N' ([Name],[Description]) VALUES(@NAME, @Description)';
EXEC sp_executesql @DynamicSql, N'@NAME NVARCHAR(50), @Description NVARCHAR(200)', @NAME = @NAME, @Description = @Description;
";

db.Database.ExecuteSqlCommand(execSql,
    new SqlParameter("@Schema", "dbo"),
    new SqlParameter("@Table", "UserTypes"),
    new SqlParameter("@NAME", "AA"),
    new SqlParameter("@Description", "Test"));

注意事项

  • 绝对不要直接将未校验的用户输入的Schema、表名拼接入SQL语句,会存在严重的SQL注入风险
  • 所有业务数据(如示例中的NAME、Description)必须使用参数化传入,不要直接拼接SQL

内容的提问来源于stack exchange,提问作者user3747994

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 03:30:05