2015-12-08 98 views
1

我需要從表中刪除除了幾列以外的所有列,而我事先不知道這些列的數量和名稱。我想從sys.columns獲取列名,然後刪除除少數列外的所有列。我需要的是這樣的:在alter table中使用子查詢刪除多個列

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, 
           ) 
      ) 
+1

我不認爲可以不動態創建alter table ddl語句。 –

+0

您可以在時間只放一列。如果列數很多,而您又不想單獨編寫語句,則可以使用動態SQL來構建它們。 – gotqn

+0

您可以創建臨時表,將所有數據抽取到臨時表中,並刪除表並將臨時名稱重命名爲與刪除的表相匹配。或者您可以創建一個查詢來創建多個刪除列語句 – jean

回答

0

首先,你需要創建一個Function分裂Comma Separated StringsRows

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 = ' +''''[email protected]+''''+ 
      ' and column_name not in (SELECT Value FROM dbo.FnSplit('+''''[email protected]+''''+','','')) 
      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 

--Creating樣品表

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

然後執行以下Stored Procedure. 的參數是:1。表名2.列需要留(逗號分隔值)

exec DropColumnExceptGivn 'pets1','PetID, PetTypeID' 

go 
select *from pets1 

希望這將有助於

+0

不,我只知道哪些列需要被留下。該表不斷更新並添加新列。每隔一段時間我需要刪除添加的所有列。 – LynnXe

+0

現在檢查anwser我編輯它 – bmsqldev