从 C# 执行存储过程会出现错误 Invalid column name 'testTable2'

Executing a Stored Procedure from C# gives the error Invalid column name 'testTable2'

我创建了一个存储过程,如果这个 table 不存在,它会创建一个 table。

  1. commented code可以成功执行这段代码。

现在的问题是我尝试从 C# 执行这段代码,我在其中重写了程序,因此我可以传递一个参数:@tableName sysname,它是 table 我尝试创建:IF NOT EXISTS.

但是,我收到了这个错误,我不明白为什么会得到:
System.Data.SqlClient.SqlException: 'Invalid column name 'testTable2'. Invalid column name 'U'.'

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

--CREATE PROCEDURE createNewTable
--AS

--IF NOT EXISTS(SELECT * FROM sys.sysobjects WHERE Name = N'testTable2' AND xtype = N'U')
--BEGIN
--CREATE TABLE testTable2
--(
--    [DateTime]    SMALLDATETIME  NOT NULL,
--    [FeatureNbr]  SMALLINT         NOT NULL,
--    [Value]       FLOAT (53)       NULL,
--    [Bool]        BIT              NULL,
--  CONSTRAINT UC_testTable2 UNIQUE (DateTime),
--  CONSTRAINT PK_testTable2 PRIMARY KEY (FeatureNbr, DateTime)
--);
--END

CREATE PROCEDURE createNewTable
    @tableName sysname

AS

BEGIN
    DECLARE @FullQuery nvarchar(1000)
    SET @FullQuery = N'IF NOT EXISTS (SELECT * FROM sys.sysobjects WHERE Name = ' + QUOTENAME(@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;
END

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

        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";
        }

我能够像这样在我的 tempdb 中创建这样的 table:

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 语句中。