2017-04-20 2 views
0

"사용자"가 지정하는 테이블에 열을 추가 할 수 있어야합니다. 따라서 테이블 이름을 동적으로 저장 프로 시저에 전달하는 것이 어떤 결과인지 궁금합니다. 아래는 내가 얻었지만 다음에 어디로 가야할지 모르겠다. 궁극적으로 사용자는 테이블 이름과 "정리"해야 할 다양한 열을 지정합니다. 이렇게하려면 테이블에 새 열을 추가하여 작업을 수행하고 싶습니다.SQL Server : 저장 프로 시저의 매개 변수로 테이블 이름

USE ******* 
GO 

CREATE PROCEDURE [dbo].[MS_FormatSectionData](
    @SectionCol varchar(50), 
    @TwpCol varchar(50), 
    @TWPDirCol varchar(50), 
    @RangeCol varchar(50), 
    @RangeDirCol varchar(50), 
    @ST_CodeCol varchar(50), 
    @Cnty_CodeCol varchar(50), 
    @Mer_CodeCol varchar(50), 
    @Stg_DB varchar(50), 
    @Tbl_Name varchar(50) 
) 
AS 
BEGIN TRY 
    DECLARE @sql_AddStgCol VARCHAR(500) 

    SET @sql_AddStgCol = 'ALTER TABLE' + @Tbl_Name + 'ADD stgSection VARCHAR(3), stgTownship VARCHAR(3), 
    stgTownshipDir VARCHAR(1), stgRange VARCHAR(3), stgRangeDir VARCHAR(1), stgSt_Code VARCHAR(2), stgCnty_Code VARCHAR(3), 
    stgMer_Code VARCHAR(3)' 

    EXEC(@sql_AddStgCol) 

END TRY 

BEGIN CATCH 
     SELECT ERROR_NUMBER() AS ErrorNumber 
    ,ERROR_SEVERITY() AS ErrorSeverity 
    ,ERROR_STATE() AS ErrorState 
    ,ERROR_PROCEDURE() AS ErrorProcedure 
    ,ERROR_LINE() AS ErrorLine 
    ,ERROR_MESSAGE() AS ErrorMessage; 
END CATCH 


GO 
+3

'alter table'에서'alter table'과''add'''''ADD'' 사이에 공백이 생기면'alter tablesomenameadd'가 생깁니다. DB engine parser는 공백이 필요합니다 !! !! – xQbert

답변

2

xQbert와 마찬가지로 - 공백을 추가하십시오. 또한 SQL 삽입을 방지하고 EXEC() 대신 sp_executesql을 사용하려면 QUOTENAME()에 테이블 이름을 래핑하는 것이 좋습니다. 이 경우에는 차이가 나지 않지만 일반적으로 좋은 습관입니다. 그러면 쿼리를 매개 변수화 할 수 있습니다.

DECLARE @sql_AddStgCol NVARCHAR(1000); 

SET @sql_AddStgCol = N' 
    ALTER TABLE ' + QUOTENAME(@Tbl_Name) + ' 
    ADD stgSection VARCHAR(3), 
     stgTownship VARCHAR(3), 
     stgTownshipDir VARCHAR(1), 
     stgRange VARCHAR(3), 
     stgRangeDir VARCHAR(1), 
     stgSt_Code VARCHAR(2), 
     stgCnty_Code VARCHAR(3), 
     stgMer_Code VARCHAR(3);'; 

EXECUTE sp_executesql @sql_AddStgCol; 
관련 문제