Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从C执行存储过程会导致错误,列名称“testTable2”无效_C#_Sql Server_Stored Procedures - Fatal编程技术网

C# 从C执行存储过程会导致错误,列名称“testTable2”无效

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

我创建了一个存储过程,如果表不存在,它将创建一个表

注释后的代码可以成功执行此代码。 现在的问题是,我试图从C执行这段代码,在C中我重写了过程,因此我可以传递一个参数:@tableName sysname,它是我试图创建的表的名称:IF NOT existed

然而,我收到了这个错误,我不明白为什么我会得到: System.Data.SqlClient.SqlException:'无效列名'testTable2'。列名“U”无效

存储过程代码:注释后的代码可以自行执行。后面的代码应该类似,但从C执行时收到错误

C代码:执行createNewTable存储过程的代码


我可以在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;