新表列添加到Microsoft SQL Server的具体顺序位置
-
12-09-2019 - |
题
是否有可能列在Microsoft SQL Server的?
特定的顺序位置添加到表例如,我们的表始终CreatedOn,CreatedBy,LastModifiedOn,LastModifiedBy列在每个表定义的“终结”?我想新的列在SSMS露面这些列以上。
如果我在我的脚本所有数据库的变化,有没有办法保存在表的末尾这个命令?
通知你,我并不想提起。如果这甚至应该做的火焰战争。如果您想了解迅速退化成一个线程,这里是一个很好的一个:
http://www.developersdex.com/sql/message。 ASP?p值= 581&R = 5014513
解决方案
您必须创建,反映了原始表的模式一个临时表但列的顺序是你想要的,那么原来的内容复制到温度。删除原始和重命名的临时
这是什么SQL Management Studio中做幕后。
通过一个模式同步工具,可以自动生成这些脚本。
其他提示
答案是肯定的,这在技术上是可行的,但你将有一个头痛这样做,这将需要很长的时间来执行,并成立。
<强>一:创建/复制/删除/重命名强>
这其实就是SQL Server在图形界面做的:这里是它产生,当你点击添加新列的表开始后的“保存”按钮,执行脚本的例子。
/* To prevent any potential data loss issues, you should review this script in detail before running it outside the context of the database designer.*/
BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
GO
CREATE TABLE dbo.Tmp_SomeTable
(
MyNewColumn int NOT NULL,
OriginalIntColumn int NULL,
OriginalVarcharColumn varchar(100) NULL
) ON [PRIMARY]
TEXTIMAGE_ON [PRIMARY]
GO
ALTER TABLE dbo.Tmp_SomeTable SET (LOCK_ESCALATION = TABLE)
GO
SET IDENTITY_INSERT dbo.Tmp_SomeTable ON
GO
IF EXISTS(SELECT * FROM dbo.SomeTable)
EXEC('INSERT INTO dbo.Tmp_SomeTable (OriginalIntColumn, OriginalVarcharColumn FROM dbo.SomeTable WITH (HOLDLOCK TABLOCKX)')
GO
SET IDENTITY_INSERT dbo.Tmp_SomeTable OFF
GO
DROP TABLE dbo.SomeTable
GO
EXECUTE sp_rename N'dbo.Tmp_SomeTable', N'SomeTable', 'OBJECT'
GO
GO
COMMIT
<强>二:ADD COLUMN / UPDATE / DROP COLUMN / RENAME 强>
这个方法基本上涉及创建要添加到您的新列的“正确”的任何现有列的副本,将数据转移到新列,然后丢弃原件和重命名新的。这将是一场浩劫与你有任何索引或约束,因为你必须重新指向他们。这在技术上是可行的,但再费时无论是在制定和执行方面。
CREATE TABLE MyTest (a int, b int, d int, e int)
INSERT INTO MyTest (a,b,d,e) VALUES(1,2,4,5)
SELECT * FROM MyTest -- your current table
ALTER TABLE MyTest ADD c int -- add a new column
ALTER TABLE MyTest ADD d_new int -- create copies of the existing columns you want to move
ALTER TABLE MyTest ADD e_new int
UPDATE MyTest SET d_new = d, e_new = e -- transfer data to the new columns
ALTER TABLE MyTest DROP COLUMN d -- remove the originals
ALTER TABLE MyTest DROP COLUMN e
EXEC SP_RENAME 'MyTest.d_new', 'd'; -- rename the new columns
EXEC SP_RENAME 'MyTest.e_new', 'e';
SELECT * FROM MyTest
DROP TABLE MyTest -- clean up the sample
<强>三:住与它强>
这强烈地冒犯了我的秩序感......但有时,它只是不值得洗牌。
要我所知有改变列的排列顺序没有已知的方法。幕后SQL Management Studio中所做的何塞·巴西利奥说。如果你有一个大表,则是不切实际的更改列这样的订单方式。
可以使用一个“视图”。使用SQL视图,您可以使用您喜欢的任何顺序而不会受到表列的变化。
TFS 2013会为你做这个自动
新列(S)添加到您的表反正你喜欢,然后提交更改到TFS。从那里,你可以在Visual Studio中打开表的SQL文件和手动移动在T-SQL中列的顺序创建脚本。然后,你可以更新使用VS的架构目标数据库比较工具在工具发现> SQL服务器>新模式比较。选择与你的变化作为源,并且要更新为目标数据库的数据库项目。比较,选择表的脚本,并更新。 VS将下降并自动添加。您的所有数据都将是安全的,和索引了。
脏和简单。结果, 导出表到CSV。结果 在需要的位置插入新的数据。结果 跌幅榜。结果 与所需的列规格创建新表。结果 从CSV到新表装入列。
我认为是简单是添加列ALTER TABLE table1的ADD ..然后创建一个TMP表像从选择tmp_table1等
的 SELECT col1,col2,col5,col3,col4 into tmp_table1 from table1;
强>
然后删除表1和重命名tmp_table1到Table 1,就是它了。我希望这会帮助别人
我不知道,如果线程仍然活跃。我在和MySQL数据库相同的查询。右键单击该表并选择“ALTER”自动生成下面的代码。从sakila的DB提供样品,它的工作。只要找到了之后,你要放置新列和使用“后”关键字列
ALTER TABLE `sakila`.`actor`
CHANGE COLUMN `middle_name` `middle_name` VARCHAR(50) NULL DEFAULT NULL AFTER `first_name`;
选择在临时表中的所有列,并创建你想要新列新表 删除旧表,选择所有从临时表中的列,并插入到新的与重新排序列。和没有数据丢失
select * FROM TEMP
select * from originaltbl
select * from #Stagintbl
declare @ColumnName nvarchar(max);
set @ColumnName=(select
distinct
stuff((
select ',' + a.COLUMN_NAME
from (select Column_name from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME='originaltbl') a
for xml path('')
),1,1,'') as ColumnName)
declare @Sqlquery nvarchar(max)
set @Sqlquery='select '+@ColumnName+' from #Stagintbl'+'';
Insert into originaltbl
Execute(@Sqlquery)