在 alter table 中使用子查询删除多个列

Drop multiple columns using subquery within alter table

我需要从 table 中删除除少数列之外的所有列,而我事先不知道这些列的编号和名称。我想从 sys.columns 中获取列名,然后删除除少数列之外的所有列。我需要这样的东西:

alter table Table
drop column (
            select a.name as ColumnName 
            from sys.all_columns a
            INNER JOIN sys.tables b
            on a.object_id = b.object_id
            where b.name = 'Table'
            where a.name NOT IN (
                                     RowID, 
                                     RemoteUserId, 
                                     Email, 
                                     FirstName, 
                                 )
            )

首先您需要创建一个 Function 以将 Comma Separated Strings 拆分为 Rows

CREATE FUNCTION [dbo].[FnSplit]
(
@List nvarchar(2000),
@SplitOn nvarchar(5)
)  
RETURNS @RtnValue table 
(

Id int identity(1,1),
Value nvarchar(100)
) 
AS  
BEGIN
While (Charindex(@SplitOn,@List)>0)
Begin 
Insert Into @RtnValue (value)
Select
Value = ltrim(rtrim(Substring(@List,1,Charindex(@SplitOn,@List)-1))) 
Set @List = Substring(@List,Charindex(@SplitOn,@List)+len(@SplitOn),len(@List))
End 

Insert Into @RtnValue (Value)
Select Value = ltrim(rtrim(@List))
Return
END
GO

然后在下面创建 Stored Procedure

 Create Procedure DropColumnExceptGivn
 @table  varchar(50),
 @Column Varchar(max)
 AS
 BEGIN
 SET NOCOUNT ON;
      declare @variables AS TABLE (cols varchar(max))
      declare @sql varchar(max) = ''
      declare @sql1 varchar(max) = ''
      declare @cols nvarchar(max) =''


  set @sql1 = 'SELECT Stuff((select '',''+ Column_name '+'from INFORMATION_SCHEMA.COLUMNS where 
            table_name = ' +''''+@table+''''+
            ' and column_name not in (SELECT Value FROM dbo.FnSplit('+''''+@column+''''+','','')) 
            for xml path('''')),1,1,'''')'
  print @sql1

  insert into @variables
  exec (@sql1)  
  select @cols = cols  from @variables 
  select @cols 

  set @sql= 'alter table '+ @table + ' drop column ' + @cols 

  print @sql 

  exec (@sql)
  end

  go

--创建样本Table

Create table pets1 (petid int, PetTypeID int, PetName Varchar(20),OwnerId int)
go

然后执行下面的Stored Procedure. 参数是:1. Table 名称 2. 需要保留列(逗号分隔值)

exec DropColumnExceptGivn 'pets1','PetID, PetTypeID'

go
select *from pets1

希望这会有所帮助