2014-06-19 2 views
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, 존재하는 경우 .. 완전히 잘못되었습니다.

이 문제 2, 당신은 첫 번째 작업을

문제 3을 실행하지 않고 @SQL을 덮어, 당신은 주위에 대괄호가 있었다 [대 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

도움을 주심 감사합니다. 나는 그 방울의 첫 번째 줄을 쓰는 다른 방법이 있는지 궁금하다. DECLARE @SQL VARCHAR (MAX) = '존재하는 경우 (선택 * FROM sys.objects WHERE object_id .... – user3756697

+0

그것은 "벨트 및 팔찌" 100 % 확신 할 수있는 방법입니다. 때로는 못생긴 것이 가장 좋습니다. 동적 SQL을 사용해야합니까? –