如何将 SQL 值插入 SQL 命令以创建 table?

How do I insert SQL values into an SQL Command to create a table?

我正在尝试从 Visual Studio 在 SQL 中创建一个 table,但我不断收到一个异常,内容为“'Incorrect Syntax Near '@tableName '.'" 我是否错误地使用了参数值,我尝试仅使用 Parameters.Add("@tableName", SQLDbType.VARCHAR) 并手动添加值,但我得到了同样的例外。

public string CreateTable(string tableName)
           try
           {
               using (SqlConnection conn = new SqlConnection(this.connectionstring))
               {
                   SqlCommand cmd = new SqlCommand($"CREATE TABLE @tableName(indicatorid INT IDENTITY(1,1) NOT NULL PRIMARY KEY, value REAL, date DATE, ticker VARCHAR(20))", conn);
                   cmd.Parameters.AddWithValue("@tableName", tableName);
                   conn.Open();
                   var result = cmd.ExecuteNonQuery();
                   conn.Close();
                   return "Database Initialized";
               }
           }
           catch
           {
               return"Failure Creating Test Table";
           }

您可以使用带参数的存储过程

using (SqlCommand cmd = new SqlCommand("sp_Create_New_Table", con)) {
      cmd.CommandType = CommandType.StoredProcedure;
      cmd.Parameters.AddWithValue("@tableName", tableName);
      conn.Open();
      var result = cmd.ExecuteNonQuery();
      conn.Close();
      return "Database Initialized";
    }

为此您需要使用动态 SQL。

  • 注意: 您必须使用 QUOTENAME
  • 正确转义 table 名称
  • 我建议你不要盲目捕获所有异常。让它们传递给调用函数,调用函数可以决定如何显示或记录错误。
  • 参数应该是nvarchar(128)
  • 注意使用 @""
  • 逐字 multi-line 字符串
public void CreateTable(string tableName)
{
    const string query = @"
DECLARE @sql nvarchar(max) = '
CREATE TABLE ' + QUOTENAME(@tableName) + '(
  indicatorid INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
  value REAL,
  date DATE,
  ticker VARCHAR(20)
)
';

EXEC sp_executesql @sql;
";
    using (SqlConnection conn = new SqlConnection(this.connectionstring))
    using (SqlCommand cmd = new SqlCommand(query, conn)
    {
        cmd.Parameters.Add("@tableName", SqlDbType.NVarChar, 128).Value = tableName;
        conn.Open();
        cmd.ExecuteNonQuery();
    }
}