2017-02-22 10 views
0

IDNvarchar(80) [MSSQL]の列の1つを持つテーブルTab1があります。私は、初期値= 00100000のような変数を持っていて、次に001000010010000200100003というようにインクリメントしたいと思っています。それを使って、この変数からtab1.idをループで取り出します。誰も私にこれを手伝うことができますか?MSSQLでnvarchar型を増やす方法

+2

Do not。代わりに、int identityカラムを使用してください。ユーザーが設計した自動インクリメント列は、失敗するようにバインドされています。私はAaron BertrandやMartin Smithのような伝説が、アイデンティティやシーケンスを使わずに単純なSQLを使って信頼性の高い自動インクリメント列を書くことができるとは確信していません。 – ATC

答えて

4

変数を増やしたい場合は、NVARCHARは必ずしも正しい方法ではありません。しかし、私はあなたがこれを行う理由があると仮定します。先行ゼロに値を挿入するには

SELECT CAST(<column_name> AS INT) + 1 FROM Tab1; 

、あなたには、いくつかの連結を行うために必要になるだろう:言われて、値をインクリメントするのと同じくらい簡単であること

SELECT '00' + CAST(CAST(<column_name AS INT) + 1 AS NVARCHAR(80)) FROM Tab1; 

だけSQL Serverは、1を追加しようとすると、NVARCHARの値をINTEGERの値に自動的に変換しようとするため、技術的に短縮することができます。

SELECT '00' + CAST(<column_name> + 1 AS NVARCHAR(80)); 

最終的に2つの先行ゼロを上書きする値に到達することを期待している場合は、後でその点を考慮する必要もあります。あなたがこれを行うことができるいくつかの方法があります。最も簡単なもののうち:

SELECT RIGHT('00000' + CAST(<column_name> + 1 AS NVARCHAR(80)),8); 
+1

これはまったく安全ではありません。同じ時間にこのコードを実行する複数のユーザーは、同じ番号を取得します。明らかに@AQC。 – ATC

+0

OPはすでにIDENTITY列の使用に関するコメントが1つありますが、何人のユーザーがこのデータを同時にインクリメントしていくのかについては何も言いません。私はこれが行く方法ではないと言って始めました。私の唯一の目標は、OPの実際の質問に答えることだったので、NVARCHARのインクリメントは残念です。 – 3BK

+1

ID列に基づいて計算された列を使用することをお勧めします。シンプルでクリーンでスレッドセーフです。 – ATC

関連する問題