2016-10-05 2 views
1

Wie kann ich a000001, a000002 in einer Schleife generieren? (Int + 1) varchar (6) oder char (6) ohne INT IDENTITY Hilfe dankGenerieren/füllen Sie eine ID wie a000001, a000002 ohne ID ID INT IDENTITY sql server

DECLARE @LoopCounter as INT 
DECLARE @MaxBranchId as INT 
DECLARE @id INT 
DECLARE @val as varchar(6)  
SELECT @MaxBranchId= count(*) 
FROM branch 
Set @LoopCounter =0 
Set @id=1 
WHILE(@MaxBranchId is not null and @LoopCounter < @MaxBranchId) 
BEGIN 


update Branch set branchId= @val 
SET @LoopCounter = @LoopCounter + 1  
END 
+3

Warum möchten Sie eine Schleife verwenden? Das ist der falsche Weg, um dieses Problem zu lösen. –

+0

Ich möchte a00001, a00002 ... in eine existierende Tabelle mit einem Wert füllen, der momentan null ist. Eine Schleife zu verwenden ist einfacher –

+1

Wenn Sie nur inkrementelle Zahlen generieren, verwenden Sie eine Identität und vergessen Sie das Präfix "a". Und wie @GordonLinoff schon gesagt hat. Eine Schleife ist völlig falsch dazu. Dies sollte eine einzelne Update-Anweisung sein, die wahrscheinlich ROW_NUMBER verwendet. –

Antwort

1

Es kann eine Teilantwort sein, können Sie eine Vorstellung auf der Abfrage erhalten basiert.

Mit dieser Abfrage können Sie eine Zeilennummer erstellen und eine automatische Inkrement-ID generieren.

Basierend auf diesem Wert können Sie mit der tatsächlichen Branch-Tabelle verbinden und entsprechend Ihrer Anforderung aktualisieren.

Proben Ausführung mit Beispieldaten:

CREATE TABLE Branch (
    BranchId VARCHAR(7) NULL, 
    BranchName VARCHAR (500) 
); 

INSERT INTO Branch (BranchName) VALUES 
('Branch 001'), ('Branch 002'), ('Branch 003'), ('Branch 004'), ('Branch 005'), 
('Branch 006'), ('Branch 007'), ('Branch 008'), ('Branch 009'), ('Branch 010'); 

CREATE TABLE #Tmp_TableForBranchUpdate (BranchName VARCHAR (500), BranchId INT); 

INSERT INTO #Tmp_TableForBranchUpdate (BranchName, BranchId) 
SELECT BranchName, ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) BranchId 
FROM Branch 

UPDATE BR SET BranchId = TE.NewBrachId 
FROM Branch BR 
JOIN #Tmp_TableForBranchUpdate UT ON UT.BranchName = BR.BranchName 
JOIN (
    SELECT 'a' + REPLICATE('0', 6 - LEN(BranchId)) + CAST(BranchId AS VARCHAR) AS NewBrachId , BranchId 
    FROM (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) BranchId FROM Branch) A 
    ) TE ON TE.BranchId = UT.BranchId 

DROP TABLE #Tmp_TableForBranchUpdate 

-- SELECT * FROM Branch 
+0

Vielen Dank, Arulkumar –

1

Sie Sequenz in SQL Server

CREATE SEQUENCE testseq START WITH 1 INCREMENT BY 1 

SELECT 
    concat('a', RIGHT('00000' + CONVERT(varchar(5), NEXT VALUE FOR testseq), 5)) 
0

Verwenden Sie einfach einen CTE und row_number() verwenden: für

with toupdate as (
     select b.*, row_number() over (order by (select null)) as seqnum 
     from branch b 
    ) 
update toupdate 
    set branchid = 'a' + right('000000' + cast(seqnum as varchar(255)), 6); 

Es besteht keine Notwendigkeit ein Schleifenkonstrukt.

0
;WITH CTE 
AS 
(
SELECT 1 AS ANCHOR 
UNION ALL 
SELECT A.ANCHOR +1 FROM CTE A 
) 
SELECT TOP 100 CONCAT('a',RIGHT(CONCAT('00000',ANCHOR),6)) AS RecurrenceValue FROM CTE OPTION (MAXRECURSION 0) 
+0

Gut, einige Code zu geben, aber es sollte mit einigen Erklärungen zu zeigen, die Änderungen und warum es die Lösung der OP-Frage ist . –