2014-06-19 39 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?你從來沒有回答過我的問題。 –