SQL Server:表名作为存储过程中的参数

时间:2017-04-20 18:59:30

标签: sql-server stored-procedures

我需要能够将列添加到将由" user"指定的表中。因此,我想知道将表名动态传递给存储过程可能是什么样子。以下是我已经得到但不知道下一步该去哪里。最终,用户将指定表名和需要清理的各种列"。为此,我想在表中添加新列,然后执行操作。

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

1 个答案:

答案 0 :(得分:2)

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

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;