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