如何使用 Select 查询带参数的 table 名称?

How to use Select query for table names with parameters?

当使用 Insert 查询时,参数将正常工作,因为它用于值,但如果我要为 Create[=27 使用参数=] 或 Select 查询 table 名称,它不会发生,因为显然 table 名称必须是静态的。

#例如

 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 查询,因为我将从他们创建的 table 中进行选择。

遗憾的是我无法想出解决方案,不得不使用非参数方式,这很容易受到 SQL 注入的攻击,我过去几天所做的 google 搜索没有'不要帮我。

如何在 SQL 服务器中使用 Create/Select 查询 table 名称?

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

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

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

类似的保护

有关 SQL 注入的更多信息:Dynamic SQL