2014-09-10 2 views
6

Ich habe ein SQL Server-Datenbankprojekt, in dem ich einige Änderungen am Schema vorgenommen habe, wo ich Spaltendatentypen von NUMERIC (18,0) zu INT geändert habe. Wir versuchen, den für Primary Keys verwendeten Datentyp zu normalisieren, es handelt sich derzeit um einen 50/50 Mix.Wie entscheidet SQL Server Database Project: Publish, wann eine Tabelle neu erstellt werden soll?

Wenn ich das Veröffentlichen Skript generieren, werden einige der Tabellen im Skript neu erstellt:

CREATE TABLE [dbo].[tmp_XYZ] 
INSERT TABLE [dbo].[tmp_XYZ] SELECT ... FROM [dbo].[XYZ] 
DROP TABLE [dbo].[XYZ] 
sp_rename N'[dbo].[tmp_XYZ]', N'XYZ'; 

aber auch andere Tabellen werden nur über ALTER Aussagen aktualisiert

ALTER TABLE [dbo].[ABC] ALTER COLUMN [AbcID] INT NULL;

Gibt es eine Regel das diktiert, wann eine Tabelle neu erstellt wird und wann sie gerade geändert wird?

+0

Sie können eine Spaltendefinition nicht ändern, wenn sie Teil eines Schlüssel/Index ist. Das Löschen der Schlüssel, das Ändern der Definition und das erneute Erstellen der Schlüssel ist im Allgemeinen kostspieliger als das Erstellen der parallelen Struktur mit der neuen Definition, das Löschen der alten und das Umbenennen. –

Antwort

0

Wahrscheinlich der beste Weg ist, mit der rechten Maustaste auf Ihren Objektnamen und wählen Sie Skript als ... Dann haben Sie Optionen zum Erstellen oder Ändern Wenn Sie nicht finden konnten, Alter, können Sie zur Design-Ansicht gehen, klicken Sie mit der rechten Maustaste und wählen Sie Generate Change Script ... um die alter-Anweisung zu finden.

0

Dies ist nur ein einfaches Problem. Es ist das gleiche Problem wie beim Ändern einer Tabelle im Tabellendesigner. Ich glaube, Sie haben eine Spalte in Ihrem Tabellendesign geändert, die die Tabelle löschen und neu erstellen muss, damit die Spalte an derselben Position angeordnet werden kann.

Hier ist ein kurzes Beispiel. Nehmen Sie diese Tabelle Design wie folgt:

CREATE TABLE dbo.Test(
    id int identity(1,1), 
    firstname nvarchar(100), 
    name nvarchar(100), 
    street nvarchar(100) 
) 

Dies wird die Spalten in einer angegebenen Reihenfolge erstellen. Sie können diese Reihenfolge sehen hier:

SELECT name, column_id 
FROM sys.columns 
WHERE object_id = OBJECT_ID(N'dbo.Test') 

Sie werden so etwas sehen:

column_name column_id 
id   1 
firstname 2 
name  3 
street  4 

Wenn Sie die Spalte name über Designer oder in Ihrem Fall in den Daten Projekt ändern, wird dies dazu führen, SQL Server, um diese Reihenfolge aufrecht zu erhalten. In diesem Fall versuchen Sie, die Spalte name in lastname zu ändern. Dies erzwingt SQL Management Studio und andere Programme wie diese, um die column_id aufrecht zu halten. Dies ist nur möglich, wenn die Tabelle mit der richtigen Spaltenreihenfolge vollständig neu erstellt wurde. SQL Server erstellt einen temporären Tabellenstub, fügt alles darin ein, löscht die alte Tabelle und benennt die temporäre Tabelle in den alten ursprünglichen Namen um. Genau wie in Ihrem Code oben.

Danach können Sie so etwas sehen werden:

column_name column_id 
id   1 
firstname 2 
lastname 3 
street  4 

Wenn Sie einfach nur die letzte Spalte umbenennen würden oder es manuell tun, wäre alles in Ordnung. Manuell wäre viel effizienter, da nicht alle Daten in eine neue Tabelle verschoben werden müssen. Die manuelle Art und Weise wäre dies:

-- Create the new column 
ALTER TABLE dbo.Test ADD lastname nvarchar(100) 
GO 
-- Populate the new column using the old one 
UPDATE dbo.Test 
SET lastname = name 
GO 
-- Drop the old column afterwards 
ALTER TABLE dbo.Test DROP COLUMN name 

Dieses Verhalten in folgendem Ergebnis führt:

column_name column_id 
id   1 
firstname 2 
street  4 
lastname 5 

Die letzte viel effizienter sein wird, wie bereits erwähnt.

Hoffentlich wird dies Ihre Frage beantworten, auch wenn die Antwort in letzter Zeit kommt.

Verwandte Themen