在运行时通过存储过程创建表在 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但未在用户代码中处理
其他信息:"附近的语法不正确。
否,存储过程的语法是错误的。
这应该是正确的文本
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))