C# 从C执行存储过程会导致错误,列名称“testTable2”无效
我创建了一个存储过程,如果表不存在,它将创建一个表 注释后的代码可以成功执行此代码。 现在的问题是,我试图从C执行这段代码,在C中我重写了过程,因此我可以传递一个参数:@tableName sysname,它是我试图创建的表的名称:IF NOT existed 然而,我收到了这个错误,我不明白为什么我会得到: System.Data.SqlClient.SqlException:'无效列名'testTable2'。列名“U”无效 存储过程代码:注释后的代码可以自行执行。后面的代码应该类似,但从C执行时收到错误 C代码:执行createNewTable存储过程的代码C# 从C执行存储过程会导致错误,列名称“testTable2”无效,c#,sql-server,stored-procedures,C#,Sql Server,Stored Procedures,我创建了一个存储过程,如果表不存在,它将创建一个表 注释后的代码可以成功执行此代码。 现在的问题是,我试图从C执行这段代码,在C中我重写了过程,因此我可以传递一个参数:@tableName sysname,它是我试图创建的表的名称:IF NOT existed 然而,我收到了这个错误,我不明白为什么我会得到: System.Data.SqlClient.SqlException:'无效列名'testTable2'。列名“U”无效 存储过程代码:注释后的代码可以自行执行。后面的代码应该类似,但从C
我可以在tempdb中创建这样的表,如下所示:
declare @tableName sysname
set @tableName = N'testTable2'
DECLARE @FullQuery nvarchar(1000)
SET @FullQuery = N'IF NOT EXISTS (SELECT * FROM sys.sysobjects WHERE Name = ''' + @tableName + ''' AND xtype=''U'') ' +
'CREATE TABLE ' + QUOTENAME(@tableName) + ' ([DateTime] SMALLDATETIME NOT NULL, [FeatureNbr] SMALLINT NOT NULL, [Value] FLOAT (53) NULL, [Bool] BIT NULL,
CONSTRAINT ' + QUOTENAME(CONCAT(N'UC_',@tableName)) + ' UNIQUE (DateTime),
CONSTRAINT ' + QUOTENAME(CONCAT(N'PK_',@tableName)) + ' PRIMARY KEY (FeatureNbr, DateTime)); '
EXECUTE sp_executesql @FullQuery;
报价问题在if语句中。什么是N?什么是Name=N'SomeText'。看不到其定义的位置您是否考虑过选择@FullQuery,这将在执行它之前显示您的问题,这是将要执行的内容?您是否尝试过在SSMS查询窗口中执行存储过程?在执行C应用程序之前,确保它执行您想要的操作。N表示字符串应该是我所理解的unicode。@Squirrel。在存储过程中注释的代码在查询窗口中工作,并且执行它应该执行的操作。所以我试着重写它,这样我就可以在C@coding我的帮助是为你指出正确的方向,这样你就可以发现你不知道如何解决的问题。是的,我本可以给你一个答案,但这不是重点,因为它不能帮助你理解。输出应该是将要执行的完整查询。如果你看看这个输出,你就会在这个答案中意识到上面的问题。任何时候当您遇到动态查询问题时,请将其选中,这样您就可以看到将执行什么。您缺少如上所述的引号,其中Name=[testTable2]和xtype=U,您需要将testTable2和U一起用引号括起来。您应该能够从我的示例中获取输出字符串查询,并将其放入新窗口并运行它。如果失败,它将告诉您原因。@在创建表时进行编码,名称本身不必包装,也不能使用。@đěxěŕ是的,我想我现在明白了区别。我想QUOTENAME让我感到困惑,认为它实际上创建了正常的引号,但现在读到它返回的结果:使用这个方法来调查什么可能是错误的是很好的。谢谢你!
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", "testTable2"));
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";
}
declare @tableName sysname
set @tableName = N'testTable2'
DECLARE @FullQuery nvarchar(1000)
SET @FullQuery = N'IF NOT EXISTS (SELECT * FROM sys.sysobjects WHERE Name = ''' + @tableName + ''' AND xtype=''U'') ' +
'CREATE TABLE ' + QUOTENAME(@tableName) + ' ([DateTime] SMALLDATETIME NOT NULL, [FeatureNbr] SMALLINT NOT NULL, [Value] FLOAT (53) NULL, [Bool] BIT NULL,
CONSTRAINT ' + QUOTENAME(CONCAT(N'UC_',@tableName)) + ' UNIQUE (DateTime),
CONSTRAINT ' + QUOTENAME(CONCAT(N'PK_',@tableName)) + ' PRIMARY KEY (FeatureNbr, DateTime)); '
EXECUTE sp_executesql @FullQuery;