如何在MS SQL Server中的前5列之后从表中删除列

时间:2015-07-08 04:28:02

标签: sql-server

如何在MS SQL Server中的前5列之后从表中删除列。 我有一个默认5列的表,但可以动态添加更多列。 所以我需要删除没有默认列的所有动态列。在我的案例中,前5列。

2 个答案:

答案 0 :(得分:2)

您可以使用动态SQL来执行此操作。您需要为表的每列生成ALTER TABLE... DROP COLUMN...脚本。要获取列,您需要从sys.columns进行查询。

测试数据:

CREATE TABLE testTable(
    col1    INT IDENTITY(1,1),
    col2    INT,
    col3    INT,
    col4    INT,
    col5    INT,
    col6    INT,
    col7    INT
)

动态SQL

DECLARE @sql VARCHAR(MAX) = ''

SELECT @SQL = @sql + CHAR(10) +
'ALTER TABLE testTable DROP COLUMN ' + QUOTENAME(name) + ';'
FROM sys.columns
WHERE 
    object_id = OBJECT_ID('testTable')
    AND column_id > 5

PRINT @sql
EXEC(@sql)

但是,你正在做的事情是一种非常糟糕的做法。

答案 1 :(得分:1)

这是一个诀窍的解决方案。

CREATE TABLE MyTable
    (
    col1 int,
    col2 int,
    col3 int,
    col4 int,
    col5 int,
    col6 int,
    col7 int,
    col8 int,
    col9 int,
    col10 int,
    col11 int,
    )

    Select column_id 
    into #tempColID
    from sys.columns where object_id = object_id('MyTable')

    DECLARE @CurrentColumnID INT
    DECLARE @Count INT 

    SET @Count = (SELECT COUNT(*) from #tempColID)

    WHILE(@Count > 0)
    begin

    SET @CurrentColumnID = (SELECT TOP 1 * from #tempColID)

    IF(@CurrentColumnID > 5)
    BEGIN
    DECLARE @colName VARCHAR(MAX) = (Select name from sys.columns WHERE column_id = @CurrentColumnID and object_id = object_id('MyTable'))
    DECLARE @qry NVARCHAR(MAX)

    IF(@colName IS NOT NULL OR @colName <> '')
    BEGIN
    Set @qry = 'alter table MyTable
    drop column '  + @colName
    END

    EXEC sp_executesql @qry
    END

    ;WITH CTE
    AS
    (
        SELECT TOP 1 * from #tempColID
    )

    Delete from CTE
    SET @Count = (SELECT COUNT(*) from #tempColID)

    end

    drop table #tempColID