【问题标题】:Deleting rest of the columns after a certain column in transact SQL在事务 SQL 中删除某个列之后的其余列
【发布时间】:2019-08-11 04:12:37
【问题描述】:

假设我有一个 3 列 Col1, col2, col3, col4, col5, col6, col7,col8........col56 我想动态删除 Col4 之后所有表中的所有列。

我知道下面的查询没有意义,因为有大量的列

更改表 删除列 Col5, col6, col7,....,Col56

有人可以建议我可以在 MS-SQL 中实现的任何替代方法吗?

【问题讨论】:

  • 可以在系统视图INFORMATION_SCHEMA.COLUMNS中创建从元数据开始的动态sql语句

标签: sql-server tsql


【解决方案1】:

假设您只有名为Col1Col2、...Col56 的列,并且它们的顺序是“正确”的(升序)我的数值)你可以这样做:

CREATE TABLE YourTable (Col1 int,
                        Col3 int,
                        Col4 int,
                        Col5 int,
                        Col6 int,
                        Col7 int,
                        Col8 int,
                        Col9 int,
                        Col10 int);
SELECT *
FROM  dbo.YourTable;
GO

DECLARE @SQL nvarchar(MAX);
DECLARE @TableName sysname = N'YourTable';

SET @SQL = N'ALTER TABLE ' + QUOTENAME(@TableName) + N' DROP COLUMN ' + 
           STUFF((SELECT N',' + QUOTENAME(C.COLUMN_NAME)
                  FROM INFORMATION_SCHEMA.COLUMNS C
                  WHERE C.TABLE_NAME = @TableName
                    AND C.ORDINAL_POSITION > 4
                    --AND C.COLUMN_NAME LIKE N'Col%' --uncomment if needed
                  ORDER BY C.ORDINAL_POSITION
                  FOR XML PATH(N''),TYPE).value(N'.',N'nvarchar(MAX)'),1,1,N'') + N';';
PRINT @SQL;

EXEC sp_executesql @SQL;
GO
SELECT *
FROM  dbo.YourTable;

GO
DROP TABLE YOurTable;

DB<>Fiddle

【讨论】:

  • 工作完美@Larnu!如何通过多个表循环此操作。在我最初的问题中,我有三个表,并且所有三个表都存在于同一个数据库中。但是这些表的数量可能会改变。有没有办法做到这一点。我了解到游标可以帮助我做到这一点,但我不了解游标在这里的应用。非常感谢@Larnu 的任何帮助。
  • 您可以将 C.TABLE_NAME = @TableName 更改为 C.TABLE_NAME IN ('Table1','Table2',....) ,然后将 QUOTENAME(@TableName) 更改为 QUOTENAME(C.TABLE_NAME) 。那应该可以。
猜你喜欢
  • 1970-01-01
  • 2020-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-21
  • 1970-01-01
相关资源
最近更新 更多