クライアントは、カウントに基づくリテラル インクリメントでフィールドを追加したいと考えています。
範囲は ' aa ' から ' zz ' です。
' aa ' は1のカウントを表し、' zz ' は範囲内の最大値を表します: 676
ほとんど機能するSQLがありますが、最後のハードルを乗り越えるために専門家の目があれば幸いです。
--Constants
DECLARE @START_ASCII INT = 97
DECLARE @ASCII_OFFSET INT = 1
DECLARE @ALPHABET_LETTER_COUNT INT = 26
--Variables
DECLARE @RecordCount INT = 0
DECLARE @FirstLetter VARCHAR(1) = NULL
DECLARE @SecondLetter VARCHAR(1) = NULL
SET @RecordCount = 1 --Range is 1 to 676 (e.g. 'aa' to 'zz')
SET @FirstLetter = CHAR(round(@RecordCount / @ALPHABET_LETTER_COUNT, 2, 1) + @START_ASCII)
SET @SecondLetter = CHAR((((@RecordCount - @ASCII_OFFSET) % @ALPHABET_LETTER_COUNT) + @START_ASCII))
SELECT @FirstLetter + @SecondLetter
上記の sql の問題には、最初の文字が関係しています。2 番目の文字がアルファベットの最後に到達するまで機能します。たとえば、カウントが26の場合、' az 'を期待しますが、代わりに ' bz ' を取得します。
SQL を小さくタイトに保ちたい (たとえば、CASE ステートメントを使用しない)。上記のコードが機能するように微調整することはできますか?
または、この猫の皮を剥ぐためのよりスマートな方法があれば、それを知りたい.