ループの代わりにセットベースのクエリを使用して目標を達成するには (ところで、StackOverflow にはそのような例がたくさんあります)、集計 (数値) テーブルを用意するか、サブクエリまたは再帰 CTE を使用してオンザフライで作成する必要があります。 .
CREATE TABLE tally (id INT NOT NULL PRIMARY KEY);
100000 まで入力するには ( Celko スタイル)
INSERT INTO tally (id)
SELECT a.N + b.N * 10 + c.N * 100 + d.N * 1000 + e.N * 10000 + 1 as N
FROM (select 0 as N union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) a
, (select 0 as N union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) b
, (select 0 as N union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) c
, (select 0 as N union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) d
, (select 0 as N union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) e
ORDER BY N;
これで、ストアド プロシージャは 1 つのステートメントに要約されます
CREATE PROCEDURE ActivateCertificates
@Count INT,
@CertificateNumber INT,
@Buyer VARCHAR(50)
AS
INSERT INTO Certificates (CertificateNumber, Buyer)
SELECT 'C' + CAST(q.number + t.id AS VARCHAR(12)) + '867', q.buyer
FROM
(
SELECT @CertificateNumber number, @Buyer buyer
) q, tally t
WHERE t.id <= @Count;
これがSQLFiddleのデモです
比較的少量の証明書(< 32768) を生成する場合は、再帰 CTE を使用して一連の数値を作成できます (永続的な集計テーブルは必要ありません)。
CREATE PROCEDURE ActivateCertificates
@Count INT,
@CertificateNumber INT,
@Buyer VARCHAR(50)
AS
WITH tally AS (
SELECT 1 id
UNION ALL
SELECT id + 1 FROM tally WHERE id < @Count
)
INSERT INTO Certificates (CertificateNumber, Buyer)
SELECT 'C' + CAST(q.number + t.id AS VARCHAR(12)) + '867', q.buyer
FROM
(
SELECT @CertificateNumber number, @Buyer buyer
) q, tally t OPTION (MAXRECURSION 32767);
その場合のSQLFiddleデモは次のとおりです