Sql ld从每个devs机器上的一组类中创建数据库(很像实体框架),包括更新数据库的能力。本质上是为了清理表定义。只是好奇,为什么不将有效列推到一个新表中,然后删除旧表并重命名新表?@brian可能有很多数据,并且可能有许多外键指向保留的列。坦白说,因为我没有想
Sql ld从每个devs机器上的一组类中创建数据库(很像实体框架),包括更新数据库的能力。本质上是为了清理表定义。只是好奇,为什么不将有效列推到一个新表中,然后删除旧表并重命名新表?@brian可能有很多数据,并且可能有许多外键指向保留的列。坦白说,因为我没有想,sql,sql-server,Sql,Sql Server,ld从每个devs机器上的一组类中创建数据库(很像实体框架),包括更新数据库的能力。本质上是为了清理表定义。只是好奇,为什么不将有效列推到一个新表中,然后删除旧表并重命名新表?@brian可能有很多数据,并且可能有许多外键指向保留的列。坦白说,因为我没有想到:-),如果可能的话,我还想保留数据,我有一个“重置”如果开发人员希望完全删除该表,或者只是想“更新”该表,则标记。我仍在胡思乱想,把一切都搞定。不过我会记住这一点@Krum110487您的目标是什么?要回收空间还是仅仅清理表定义?我正在开发
ld从每个devs机器上的一组类中创建数据库(很像实体框架),包括更新数据库的能力。本质上是为了清理表定义。只是好奇,为什么不将有效列推到一个新表中,然后删除旧表并重命名新表?@brian可能有很多数据,并且可能有许多外键指向保留的列。坦白说,因为我没有想到:-),如果可能的话,我还想保留数据,我有一个“重置”如果开发人员希望完全删除该表,或者只是想“更新”该表,则标记。我仍在胡思乱想,把一切都搞定。不过我会记住这一点@Krum110487您的目标是什么?要回收空间还是仅仅清理表定义?我正在开发一个库,它可以用来从每个devs机器上的一组类(很像实体框架)重新构建数据库,包括更新数据库的能力。基本上是为了清理表定义。我真的需要学习T-SQL,这非常有帮助,我现在需要做的就是生成表中当前列的列表,这将删除所有未列出的列!伟大的还有,是否有一种更简单的方法来生成项目列表,而不是简单的AND(名称“column 1”或名称“column 2”或名称“column 3”),这是我计划生成的,我假设,我可以简单地为“c”变量生成它。@Krum110487 SQL Server的哪个版本?如果2008+无法针对表值参数存在。如果之前您可以手动填充一个临时表,并针对该表执行一个不存在的操作。我真的需要学习T-SQL,这非常有帮助,我现在需要做的就是生成表中当前列的列表,这将删除所有未列出的列!伟大的还有,是否有一种更简单的方法来生成项目列表,而不是简单的AND(名称“column 1”或名称“column 2”或名称“column 3”),这是我计划生成的,我假设,我可以简单地为“c”变量生成它。@Krum110487 SQL Server的哪个版本?如果2008+无法针对表值参数存在。如果早些时候您可以手动填充一个临时表,并针对该表执行一个不存在的操作。啊,这很有意义!这段代码的要点是用于数据库生成,因此基本上只用于开发人员,而不是生产脚本,只是为了让我的生活更轻松,谢谢!啊,这是有道理的!这段代码的要点是用于数据库生成,因此基本上只用于开发人员,而不是生产脚本,只是为了让我的生活更轻松,谢谢!
declare @counter int
declare @col_count int
declare @col_name char(100)
declare @temp_sql char(100)
set @counter = 0
SELECT @col_count = COUNT(*) from sys.columns
where Object_ID = Object_ID(N'test')
AND name <> 'pk_test'
while @counter < @col_count
begin
with CTE as (
select name, row_number() over (order by column_id) as ColNo
from sys.columns where object_id = object_id('test') AND name <> 'pk_test'
)
select @col_name = name from CTE where ColNo = ((@counter) + 1)
SET @temp_sql = 'ALTER TABLE test DROP column ' + @col_name + ';'
EXECUTE (@temp_sql);
set @counter = @counter + 1
end
SET @temp_sql = @temp_swl + 'ALTER TABLE test DROP column ' + @col_name
enter code here
while @counter < @col_count
begin
with CTE as (
select name, row_number() over (order by column_id) as ColNo
from sys.columns where object_id = object_id('test') AND name <> 'pk_test'
)
select @col_name = name from CTE where ColNo = ((@counter) + 1)
SET @temp_sql = 'ALTER TABLE test DROP column ' + @col_name + ';'
EXECUTE (@temp_sql);
set @counter = @counter + 1
end
declare @columns table (colnum int not null identity(1, 1), colname varchar(255));
insert into @columns(colname)
select name
from sys.columns
where object_id = object_id('test') AND name <> 'pk_test';
set @col_count = max(colnum) from @columns;
while @counter < @col_count
begin
select @col_name = name from @columns where ColNo = ((@counter) + 1);
SET @temp_sql = 'ALTER TABLE test DROP column ' + @col_name + ';'
EXECUTE (@temp_sql);
set @counter = @counter + 1;
end;
DECLARE @t NVARCHAR(512), -- the table we're affecting
@c SYSNAME; -- the column we want to keep
SELECT @t = N'dbo.test', @c = N'pk_test';
IF EXISTS
(
SELECT 1 FROM sys.columns
WHERE [object_id] = OBJECT_ID(@t)
AND name = @c
)
BEGIN
DECLARE @sql NVARCHAR(MAX);
SET @sql = N'';
SELECT @sql = @sql + N'
ALTER TABLE ' + @t + ' DROP COLUMN ' + QUOTENAME(name) + ';'
FROM sys.columns WHERE [object_id] = OBJECT_ID(@t) AND name <> @c;
PRINT @sql;
-- EXEC sp_executesql @sql;
END
ELSE
BEGIN
PRINT 'Sorry, can't delete all columns from ' + @t + '.';
END