在运行时通过存储过程创建表在 SQL Server 上成功执行,但在应用程序执行时出现运行时错误

本文关键字:执行 应用程序 运行时错误 成功 运行时 存储过程 创建 SQL Server | 更新日期: 2023-09-27 18:36:07

SQL Server 存储过程:

ALTER PROCEDURE [dbo].[tblfrends] 
    @TABLENAME nvarchar
AS
BEGIN-- use body wrappers around whole body
  SET NOCOUNT ON; -- put this at the beginning - no point in setting it at the end
  DECLARE @SQL NVARCHAR(MAX); -- dynamic SQL should always be Unicode
  SELECT @SQL = 'CREATE TABLE' + QUOTENAME(@TABLENAME) + '(`friend_one` INT,
                                                                `friend_two` INT,
                                                                `status` nvarchar(10) ,
                                                   PRIMARY KEY (`friend_one`,`friend_two`);'
  EXEC sp_executesql @sql; -- instead of EXEC(@sql)
END

C# 代码:

public void createtable()
{
    SqlCommand sqlCommand = new SqlCommand("tblfrends", access.sqlConnection);
    sqlCommand.CommandType = System.Data.CommandType.StoredProcedure;
    sqlCommand.Parameters.Add("@TABLENAME",System.Data.SqlDbType.NVarChar);
    sqlCommand.Parameters["@TABLENAME"].Value = Name.Text;
    access.crud(sqlCommand);
    if (sqlCommand.UpdatedRowSource > 0)
    {
        Response.Write("frend table");
    }
    else
    {
        Response.Write("tayn tayn fishhh");
    }
}

运行时出错:

System.Data中发生了类型为"System.Data.SqlClient.SqlException"的异常.dll但未在用户代码中处理

其他信息:"附近的语法不正确。

在运行时通过存储过程创建表在 SQL Server 上成功执行,但在应用程序执行时出现运行时错误

否,存储过程的语法是错误的。

这应该是正确的文本

ALTER PROCEDURE [dbo].[tblfrends] 
                @TABLENAME nvarchar(255) 
AS 
BEGIN
    DECLARE @SQL NVARCHAR(MAX)
    SELECT @SQL = N'CREATE TABLE ' + QUOTENAME(@TABLENAME) + 
                  N' (friend_one INT, friend_two INT, status nvarchar(10),' + 
                  N' PRIMARY KEY (friend_one,friend_two))'
    EXEC sp_executesql @sql
END

首先,您需要指定 sp 接收@TableName参数的大小,否则假定它长 1 个字符,并且您得到的表名只有第一个字母。

其次,您错过了主键声明之后的右括号。

最后,导致失败并不是一个真正的问题,但是...,在QUOTENAME命令之前和之后添加空格,并注意SQL Server不希望字段名称周围有反引号。

这就是

您的@SQL变量变成的:

CREATE TABLE[s](`friend_one` INT,
       `friend_two` INT,
        `status` nvarchar(10) ,
        PRIMARY KEY (`friend_one`,`friend_two`);

如您所见,存在多个问题。错误的单引号和缺少括号。此外,您正在尝试添加多个主键。

尝试像这样更改存储过程:

SELECT @SQL = 'CREATE TABLE' + QUOTENAME(@TABLENAME) + '(friend_one INT PRIMARY KEY,
       friend_two INT,
       status nvarchar(10))'

因此,您的@SQL变量将变为:

CREATE TABLE[s](friend_one INT PRIMARY KEY,
                friend_two INT,
                status nvarchar(10))