2014-06-19 42 views
1

我正在尝试创建一个非常简单的过程(使用简单的代码 - 我是一名初学者,并且希望保持代码尽可能简单),可以将一个表命名为“表1”,并创建一个名为表“学生”包含3列:ID,名称,标志删除/创建表(SQL - 过程)

这是我的代码,并没有在所有的工作:

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

您有意使用动态SQL?如果表格名称是静态的,则抛弃该方法。否则:

问题1,你的if存在..是完全错误的。

问题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 
+0

谢谢你的帮助。我想知道是否还有其他的方法可以写出Drop的第一行: DECLARE @SQL VARCHAR(MAX)='IF EXISTS(SELECT * FROM sys.objects WHERE object_id .... – user3756697

+0

这是“皮带和护腕”有时候丑陋是最好的,你是否需要使用动态SQL?你从来没有回答过我的问题。 –