我正在尝试创建一个非常简单的过程(使用简单的代码 - 我是初学者,我希望保持我的代码尽可能简单),这可以删除名为“Table1”的表并创建一个名为table的表“学生”包含3列:ID,名称,标记
这是我的代码,根本不起作用:
CREATE PROCEDURE Drop_Create
@Table1 VARCHAR(MAX),
@Students VARCHAR(MAX)
AS
BEGIN
DECLARE @SQL VARCHAR(MAX);
SELECT @SQL = 'CREATE TABLE ' + @Students + '('SELECT @SQL = @SQL + '[ID] [int] IDENTITY(1,1) NOT NULL,[Name] [NVARCHAR(50)] NOT NULL,[Mark] [INT])';
SET @SQL = 'IF EXISTS DROP TABLE [' + @Table1 + ']'
PRINT @SQL;
EXEC @SQL;
END
GO
答案 0 :(得分:0)
您是否故意使用动态SQL?如果表名是静态的,则表示接近。否则:
问题1,你的存在是完全错误的。
问题2,你在不执行第一个任务的情况下覆盖@SQL
问题3,[Varchar(50)]
附近有方括号即使您现在拥有它,它也会在第二次运行时中断(它会尝试再次创建@Students)。我怀疑你以某种方式混淆了自己的逻辑。
CREATE PROCEDURE Drop_Create
@Table1 VARCHAR(MAX),
@Students VARCHAR(MAX)
AS
BEGIN
-- Drop @table1
DECLARE @SQL VARCHAR(MAX) = 'IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N''' + @Table1 + ''') AND type in (N''U'')) DROP TABLE [' + @Table1 + ']'
PRINT @SQL;
EXEC (@SQL);
-- Create @Students
SET @SQL = 'CREATE TABLE ' + @Students + '('
SET @SQL = @SQL + '[ID] [int] IDENTITY(1,1) NOT NULL,[Name] NVARCHAR(50) NOT NULL,[Mark] [INT])';
PRINT @SQL;
EXEC (@SQL);
END
GO