创建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而不是nvarchar(MAX)。对象的名称不能超过128个字符,并且对象名称有一个特定的数据类型sysname,它是nvarchar(128) NOT NULL的同义词。

最新更新