首先,你需要創建一個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 = ' +''''[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
希望這將有助於
我不認爲可以不動態創建alter table ddl語句。 –
您可以在時間只放一列。如果列數很多,而您又不想單獨編寫語句,則可以使用動態SQL來構建它們。 – gotqn
您可以創建臨時表,將所有數據抽取到臨時表中,並刪除表並將臨時名稱重命名爲與刪除的表相匹配。或者您可以創建一個查詢來創建多個刪除列語句 – jean