2016-12-22 6 views
1

eine Tabelle erstellt:Berechnete Spalten in INSERT-Anweisung

CREATE TABLE [dbo].[tblPacks] 
(
    [ID] [int] NOT NULL, 
    [BatchNumber] [varchar](30) NULL, 
    [PackID] AS (CONVERT([varchar](50), 'PK' + case when len([ID]) <= (3) then CONVERT([varchar](20), right((0.001) * [ID], (3)), 0) else CONVERT([varchar](20), [ID], 0) end, 0)) PERSISTED, 
    [Status] [int] NULL 
) 

jetzt hatte ich eine neue Anforderung, die andere als diese Sequenz kann auch in dieser Tabelle hinzugefügt werden, so dass ich Computed Logic entfernen Zum Entfernen und Create Table As:

CREATE TABLE [dbo].[tblPacks] 
    (
     [ID] [int] NOT NULL, 
     [BatchNumber] [varchar](30) NULL, 
     [PackID] VARCHAR(50), 
     [Status] [int] NULL 
    ) 

Jetzt möchte ich zwei Insert-Anweisungen, welche 'PackID' Logik, die einander ähnlich sein sollen dazu ist:

AS (CONVERT([varchar](50),'PK'+case when len([ID])<=(3) then 
    CONVERT([varchar](20),right((0.001)*[ID],(3)),0) else 
    CONVERT([varchar](20),[ID],0) end,0)) 

Und eine normale Insert-Anweisung, die keine Logik hat Wie kann ich das tun?

+0

können Sie Beispieldaten für PackID hinzufügen? ICH WÜRDE ? –

+0

Bearbeitet bitte Check @ Mr.Bhosale –

+0

können Sie Beispiel für Ihren Fall hinzufügen len ([ID])> 3. und auf welcher Grundlage entscheiden wir uns, PackId initial 'pk' oder 'ab' oder beliebig zu verwenden? –

Antwort

0

Sie können benutzerdefinierte Funktion gesetzt, wie column.like diese berechnet ..

ALTER TABLE TableName ADD YourColumn AS dbo.TestFunction(otherColumn); 

dann können Sie alle Ihre Logik für diese berechnete Spalte in dieser benutzerdefinierten Funktion enthalten.

+0

Können Sie bitte erklären mehr im Detail Ich habe Sie nicht @DarkKnight –

1

Da Ihre ID Spalte nicht eine Identitätsspalte ist, können Sie einfach die Anweisung in der berechneten Spalte mit dem ID-Wert verwenden (für bessere Lesbarkeit gehe ich davon aus Sie einen Parameter @ID für Ihren ID-Wert haben):

INSERT INTO tblPacks (ID, PackID) 
VALUES (
    @ID, 
    CONVERT([varchar](50),'PK'+case when len(@ID)<=(3) then CONVERT([varchar](20),right((0.001)*@ID,(3)),0) else CONVERT([varchar](20),@ID,0) end,0) 
) 

Wenn Ihre ID Spalte tatsächlich eine Identitätsspalte ist, benötigen Sie SCOPE_IDENTITY(), um Ihren eingegebenen ID-Wert zu erhalten. Da SCOPE_IDENTITY() Ihnen jedoch nur die ID nach gibt, der Wert wurde eingefügt, benötigen Sie zwei Schritte. Es ist eine gute Idee, eine Transaktion für diese Schritte zu verwenden, um Ihre Operation atomar zu machen:

BEGIN TRAN 

INSERT INTO tblPacks (ID) VALUES (@ID) 

UPDATE tblPacks 
SET PackID = CONVERT([varchar](50),'PK'+case when len(SCOPE_IDENTITY())<=(3) then CONVERT([varchar](20),right((0.001)*SCOPE_IDENTITY(),(3)),0) else CONVERT([varchar](20),SCOPE_IDENTITY(),0) end,0) 
WHERE ID = SCOPE_IDENTITY() 

COMMIT 

Sie auch einen Trigger auf dem Tisch anstelle einer berechneten Spalte verwenden kann, die den Wert setzt, wenn Sie nicht festgelegt haben es vor :

CREATE TRIGGER TR_tblPacks ON tblPacks 
AFTER INSERT 
AS 
    UPDATE tblPacks 
    SET PackID = CONVERT([varchar](50),'PK'+case when len(inserted.ID)<=(3) then CONVERT([varchar](20),right((0.001)*inserted.ID,(3)),0) else CONVERT([varchar](20),inserted.ID,0) end,0) 
    FROM inserted 
    WHERE tblPacks.ID = inserted.ID AND tblPacks.PackID IS NULL 

Mit diesem Trigger Sie Ihren eigenen Wert in die INSERT Anweisung hinzufügen, wenn Sie es haben. Wenn Sie es nicht haben, wird der Trigger den Standardwert festlegen.

+0

Vielen Dank für Ihre Erklärung. Ich hatte einen Zweifel, dass, wenn Identifikation nicht Identität ist und ich noch PackID Reihenfolge in der Reihenfolge wie PK001, PK002 usw. erzeugen muss Wie kann ich das ohne Identität Spalte tun? @Seef –

+0

@saibharath: Überprüfen Sie den ersten Codeblock in meinem Beitrag. So machen Sie das mit einer Nicht-Identitäts-ID-Spalte. Die Trigger-Version funktioniert auch mit der Nicht-Identitäts-ID. – Sefe

+0

Ich denke, Sie haben mich nicht, lassen Sie mich im Detail erklären Zum Beispiel nehmen wir Trigger Sie schrieb len (insert.id) <= 3 bedeutet, wenn eingefügt.id ist '1' dann PackID ist PK0001 Consdier diese PK0001 Als erste Aufzeichnung und als nächstes für den zweiten Datensatz Inserted.id ID '5' dann PackID wird PK0005 sein Aber ich will es sein PK0002 irrsective von insert.id @Sefe –

Verwandte Themen