2017-04-20 46 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

空间你'改变tablesomenameadd' DB引擎解析器需要那些空间。!! – xQbert

回答

2

就像xQbert说的 - 添加空格。此外,我建议在QUOTENAME()中包装表名,以防止SQL注入并使用sp_executesql而不是EXEC()。在这种情况下,它不会有所作为,但通常这是一个很好的做法 - 然后您可以参数化您的查询。在`改变table`来改变``表之前`“add'``” ADD'`另有表后

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; 
相关问题