c# - 创建 SQL 表,使用 C# 将 tableName 作为参数传递会出错
问题描述
我正在尝试创建一个createNewTable
创建新表的存储过程。
如果我在没有 C# 的情况下按原样执行该过程,则它可以在我硬编码表的名称testTable5
(被注释的代码)的地方工作。
我现在要做的是使用 C# 执行这个存储过程。我在这里还想做的是将表的名称作为参数传递。所以我尝试传递名称:testTable5
.
但是当我执行 C# 代码时出现此错误:
System.Data.SqlClient.SqlException:''testTable5' 附近的语法不正确
我想知道我在这段代码中做错了什么?
存储过程(注释掉的代码是硬编码的原始代码)
--CREATE PROCEDURE createNewTable
--AS
--CREATE TABLE testTable5
--(
-- [DateTime] SMALLDATETIME NOT NULL,
-- [FeatureNbr] SMALLINT NOT NULL,
-- [Value] FLOAT (53) NULL,
-- [Bool] BIT NULL,
-- CONSTRAINT UC_testTable5 UNIQUE (DateTime),
-- CONSTRAINT PK_testTable5 PRIMARY KEY (FeatureNbr, DateTime)
--);
CREATE PROCEDURE createNewTable
@tableName nvarchar(max)
AS
BEGIN
DECLARE @FullQuery nvarchar(1000)
SET @FullQuery = N'CREATE TABLE ' + QUOTENAME(@tableName) + ' ([DateTime] SMALLDATETIME NOT NULL, [FeatureNbr] SMALLINT NOT NULL, [Value] FLOAT (53) NULL, [Bool] BIT NULL,
CONSTRAINT UC_' + QUOTENAME(@tableName) + ' UNIQUE (DateTime),
CONSTRAINT PK_' + QUOTENAME(@tableName) + ' PRIMARY KEY (FeatureNbr, DateTime));'
EXECUTE sp_executesql @FullQuery;
END
C# 代码(执行此存储过程)
void createNewTable()
{
using (SqlConnection conn = new SqlConnection(GetConnectionString()))
{
SqlCommand cmd = new SqlCommand("createNewTable", conn); //1. create a command object identifying the stored procedure
cmd.CommandType = CommandType.StoredProcedure; //2. set the command object so it knows to execute a stored procedure
cmd.Parameters.Add(new SqlParameter("@tableName", "testTable5"));
int i = cmd.ExecuteNonQuery();
}
}
static private string GetConnectionString()
{
return "Data Source=(LocalDB)\\MSSQLLocalDB;AttachDbFilename=C:\\Users\\andre\\source\\repos\\TestDatabaseCreation\\DatabaseTest.mdf;Integrated Security=True;Connect Timeout=30";
}
解决方案
UC_' + QUOTENAME(@tableName)
会创建类似UC_[TableName]
. 对象名称不能包含特殊字符,除非已确定分隔符(因此,如果您真的想要一个具有该名称的唯一约束,您可以将其定义为[UC_[tablename]]]
; 但我强烈建议不要使用任何这样的名称)。
您需要引用整个值:QUOTENAME(CONCAT(N'UC_',@tablename))
. 那将产生价值[UC_tablename]
。
此外,参数@tableName
不应为. 对象名称不能超过 128 个字符,并且对象名称有特定的数据类型,它是 的同义词。nvarchar(MAX)
sysname
nvarchar(128) NOT NULL
推荐阅读
- django - 基于时间和外键值的 Django 查询模型
- python - python中的1小时定时器时钟
- javascript - 在 Dynamics CRM 中,如何创建一个由 6 个字符随机生成的唯一 GUID 的字段?
- python - 在数字最近的索引、完全外连接、聚合列上合并 Pandas 时间序列数据集到最大值
- intellij-idea - 手动添加 cookie 到 chrome/intellij/tomcat 部署配置
- java - Quarkus 如何指定 JNDI 数据源
- ios - Image.grayscale(1.0) returns a full color image in SwiftUI
- regex - 列出 1 列中的唯一值并连接其他列中的相应值
- visual-c++ - 即使我删除了所有断言语句,断言仍然失败
- xcode - 如何从命令行请求用户输入(在从命令行运行脚本的同时)