新しいテーブルの列の特定の通常の位置にマイクロソフトマイクロソフトSQLサーバー
-
12-09-2019 - |
質問
することはできるカラムのテーブルに特定の通常の位置にマイクロソフトマイクロソフトSQLサーバー?
例えば、テーブルを常にCreatedOn,CreatedBy,LastModifiedOn,LastModifiedBy列の最後に"完了"の各テーブル定義?私は新しい列の立ちSSMS上これらの列を
ていただく場合スクリプティングすべてのデータベースの変更があるので、この順序でテーブルの最後に?
対ん研究所炎戦場合はまた建物ってのはあれですからねしたい場合についてスレッドが低下すると、"わらびもち"をここでができない生活を送っていると:
http://www.developersdex.com/sql/message.asp?p=581&r=5014513
解決
あなたは、元のテーブルのスキーマを反映していますがたい列の順序で、その後、一時に、元の内容をコピーし、一時テーブルを作成する必要があります。オリジナルを削除し、一時の名前を変更します。
これは、SQL Management Studioのは、舞台裏で何をするかです。
スキーマの同期ツールを使用すると、自動的にこれらのスクリプトを生成することができます。
他のヒント
の答えすることは技術的に可能であるが、ましても頭の痛いうことは出来ませんので長時間を実行します。
一:作成/コピー/Drop/名前の変更
これは実際にどのSQLサーバーは、グラフィカルインターフェイス:以下に例を示しますのスクリプトで生成および実行をクリックすると、"保存"ボタンを加えたものを新しい列の最初に表示します。
/* 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
二:列の追加/変更/ドカラム/名前の変更
この方法に基づのコピーを既存のテーブルのヘッダに追加したいの"の新しいカラムデータを転送する新しいカラム、その下の"原名を変更したいのが新しくなりました。この遊びを爆任意の指数や制約をいいのですrepointします。で技術的には可能ですが、再度時間がかかるの両方の開発および実行します。
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ビューを使用すると、テーブルの列の変更によって影響を受ける取得せずに、好きな順序を使用することができます。
の投資を維持しながら、生産性を2013年までこす自動的に.
追加の列をテーブルとにかくおものであり、そのコミットへのご変更の投資を維持しながら、生産性を.から開くことができるテーブルのsqlファイルをVisual Studioおよび手順に列のSQLスクリプトの作成.その後更新することができますの目標を利用したデータベースのVSのスキーマの比較ツールこのツール>SQLサーバー>新しいスキーマと比較しました。を選択データベースプロジェクトとしてのソースデータベースにしたい更新しています。比較を選択し、テーブルのスクリプトです。VSンドの追加ます。すべてのデータを安全になり、指数です。
汚いとシンプル。
CSVファイルへのエクスポートテーブル。
所望の位置に新しいデータを挿入します。
表を削除します。
目的の列仕様に新しいテーブルを作成します。
新しいテーブルにcsvファイルから列をロードします。
私はシンプルだと思う何が列ALTER TABLEのTABLE1のADDを追加することです。..してからのような選択からtmp_table1のようなTMP表を作成します
SELECT col1,col2,col5,col3,col4 into tmp_table1 from table1;
のの
その後、TABLE1をドロップしてTABLE1にtmp_table1の名前を変更し、それはそれです。私はそれが誰かを助けることを願っています。
私は、スレッドがまだアクティブであるかどうかわかりません。私は、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)