如何使用带参数的表名的 Select 查询?[复制]

How to use Select query for table names with parameters? [duplicate]

提问人:beriscen 提问时间:4/1/2022 更新时间:4/1/2022 访问量:288

问:

当使用 Insert 查询时,参数将正常工作,因为它用于值,但是如果我将参数用于表名的 CreateSelect 查询,它就不会发生,因为显然表名必须是静态的。

#For 示例

 SqlCommand myCommand = new SqlCommand("create table @1 ([BACK_LANG] varchar(50)");
                    myCommand.Connection = myDatabase;
                    myCommand.Parameters.AddWithValue("@1", this.getName()); //it was already set
                    myCommand.ExecuteNonQuery();

但是我确实需要使用带有参数的 Select/Create 查询,因为我将从他们创建的表中进行选择。

可悲的是,我无法想出解决方案,不得不使用非参数方式,这容易受到SQL注入的影响,我过去几天所做的谷歌搜索对我没有帮助。

如何在 SQL Server 中使用 Create/Select Queries with .NET 作为表名?

C# .NET SQL-Server 参数 SQL 注入

评论


答:

1赞 Aaron Bertrand 4/1/2022 #1

您不能像这样将对象名称作为参数直接传递给语句。您仍然可以使用参数,但命令必须如下所示:

(@"declare @sql nvarchar(max) = N'create table dbo.'
   + QUOTENAME(@1) + N'([BACK_LANG] varchar(50));';
  EXEC sys.sp_executesql @sql;")

或者只是在 C# 中构建字符串,使用 SqlCommandBuilder 的,它提供与 .QuoteIdentifier(this.getName())QUOTENAME()

有关 SQL 注入的更多信息:动态 SQL