2016-10-05 5 views
1

ループ内でa000001、a000002をどのように生成できますか? (INT + 1) VARCHAR(6)またはchar(6) INT IDENTITYに 助けのおかげIDを使用せずにa000001、a000002のようなIDを生成/作成するID INT IDENTITY SQLサーバ

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

なぜループを使用しますか?それはこの問題を解決するための間違った方法です。 –

+0

a00001、a00002 ...の値を持つ既存のテーブルに現在値を設定したいと思います。ループを使用すると簡単になります –

+1

単にインクリメンタルな数字を生成するのであれば、アイデンティティを使用せずに接頭辞 "a"を忘れてみてください。そして、@ GordonLinoffが既に述べたように。これを行うには、ループが完全に間違った方法です。これは、おそらくROW_NUMBERを使用する単一の更新ステートメントでなければなりません。 –

答えて

1

を使用せずに、それは部分的な答えであってもよいし、クエリに基づいていくつかのアイデアを得ることができます。

このクエリを使用すると、行番号を作成して自動増分IDを生成できます。

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 

この値に基づいて、実際のブランチテーブルに参加し、要件に応じて更新することができます。

サンプルデータとサンプルの実行に:

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

ありがとう、Arulkumar –

1

あなただけのCTEとrow_number()を使用する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

をシーケンスを使用することができます。

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); 

ための必要はありませんループ構造。

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

いくつかのコードを書いてよかったですが、変更点を指摘するための説明が必要で、OPの質問の解決方法。 –

関連する問題