[英]Insert n rows stored procedure
Trying to insert multiple rows based on a passed parameter. 尝试根据传递的参数插入多行。
Tried this and it only repeated once: 试过了,只重复了一次:
ALTER PROCEDURE [dbo].[ActivateCertificates]
@Count int,
@CertificateNumber int,
@Buyer VarChar(50)
AS
Declare @x int
Declare @InitialCharacter Char(1)
SET @InitialCharacter='C'
Declare @Last3 Char(3)
SET @Last3='867'
while @x <= @Count
begin
/* CREATE THE CERTIFICATE NUMBER */
set @CertificateNumber = @CertificateNumber +1
/* insert into certificates cert number and who sold to. */
INSERT into Certificates (CertificateNumber,Buyer)
VALUES (@InitialCharacter + ltrim(rtrim(cast(@CertificateNumber as char))) + @Last3, @Buyer)
end
set @x =@x + 1
GO
Your variable is incremented outside the BEGIN/END
block. 您的变量在
BEGIN/END
块外递增。 Also I would recommend you initially set your variable to 0 to avoid any potential garbage data stored in that memory location. 我也建议您首先将变量设置为0,以避免在该内存位置存储任何潜在的垃圾数据。
To achieve your goal using a set-based query instead of a loop ( BTW there are lots of such examples here on StackOverflow ) you'll have to have a tally (numbers) table or create it on a fly with a subquery or recursive CTE. 为了使用基于集合的查询而不是循环来实现您的目标( 顺便说一句,StackOverflow上有很多这样的例子 ),您必须拥有一个理货(数字)表或使用子查询或递归CTE快速创建它。
CREATE TABLE tally (id INT NOT NULL PRIMARY KEY);
To populate it up to 100000 ( Celko-style ) 将其填充到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;
Now your stored procedure boils down to one statement 现在,您的存储过程可以归结为一条语句
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;
Here is SQLFiddle demo 这是SQLFiddle演示
Now if you generate relatively small amounts of certificates (< 32768) then you can use recursive CTE to build a sequence of numbers (and don't need a persisted tally table) 现在,如果您生成的证书数量相对较少 (<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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.