我正在尝试运行存储过程以将3个连续的书籍添加到表格中...
这是我的查询...
ALTER PROCEDURE dbo.AddCards @cnt int
AS
BEGIN
while(@cnt < 810010010513)
begin
insert into prepaidbooks(sbarcode, sdescription, lServiceId, iQty, dblWashValue, dblBookPrice, lLocationId, lBookTypeId)
values(@cnt, 'Dealer Car Wash', 43, 1, 9, 0, 1, 7)
set @cnt = @cnt + 1
END
END
它无法正常工作......我出现了一个框,要求我在值框中定义@CNT
。我将其更改为810010010511,我得到了
无法转换
如果我离开它我会得到:
程序或功能'AddCards'需要参数'@cnt',即 没提供。
没有行影响。
(已返回0行) @RETURN_VALUE =已完成运行[dbo]。[AddCards]。
请帮忙。
由于
答案 0 :(得分:4)
810010010511
int
太大 - 使用BIGINT
或使用较小的数字(int
最多{{1} }})
2147483648
现在你应该能够这样执行:
ALTER PROCEDURE dbo.AddCards
@cnt BIGINT
AS
BEGIN
WHILE (@cnt < 810010010513)
BEGIN
INSERT INTO dbo.prepaidbooks(sbarcode, sdescription, lServiceId, iQty, dblWashValue, dblBookPrice, lLocationId, lBookTypeId)
VALUES (@cnt, 'Dealer Car Wash', 43, 1, 9, 0, 1, 7)
SET @cnt = @cnt + 1
END
END
并在表格中获取您的值。
作为旁注:将诸如EXECUTE dbo.AddCards @cnt = 810010010511
这样的值“硬编码”到存储过程中是一个非常糟糕的主意。对于任何其他情况,您将无法重复使用该存储过程.... 至少您应该将WHILE (@cnt < 810010010513)
的“上限”作为第二个参数传递给存储过程 - 类似这样:
@cnt
然后执行这样的存储过程:
ALTER PROCEDURE dbo.AddCards
@cnt BIGINT, @max BIGINT
AS
BEGIN
WHILE (@cnt < @max)
BEGIN
INSERT INTO dbo.prepaidbooks(sbarcode, sdescription, lServiceId, iQty, dblWashValue, dblBookPrice, lLocationId, lBookTypeId)
VALUES (@cnt, 'Dealer Car Wash', 43, 1, 9, 0, 1, 7)
SET @cnt = @cnt + 1
END
END
答案 1 :(得分:0)
我有一个不同的提案而不是循环。这将处理大约2000本书,如果你需要更多,你可以添加交叉联接。从@marc_s借用更新的签名(假设< 810010010513
真的应该是<=
,因为你说你想要3本书,而不是2本书:
ALTER PROCEDURE dbo.AddCards
@cnt BIGINT
AS
BEGIN
SET NOCOUNT ON;
--INSERT dbo.prepaidbooks
--(
-- sbarcode, sdescription, lServiceId, iQty,
-- dblWashValue, dblBookPrice, lLocationId, lBookTypeId
--)
SELECT rn, 'Dealer Car Wash' --, 43, 1, 9, 0, 1, 7
FROM
(
SELECT TOP (CONVERT(INT, 810010010513 - (@cnt)) + 1) rn =
810010010513 - (ROW_NUMBER() OVER (ORDER BY [object_id]) - 1)
FROM sys.all_objects
ORDER BY [object_id]
) AS y
ORDER BY rn;
END
GO
EXEC dbo.AddCards 810010010511;
结果:
810010010511 Dealer Car Wash
810010010512 Dealer Car Wash
810010010513 Dealer Car Wash
如果您对输出感到满意,请取消注释INSERT
部分(我将其留下以便您可以测试输出)和SELECT
列表的其余部分(我只是将它们排除在外)为简洁起见。)
另外我建议你重命名参数 - 它不是很直观。严格来说,你没有通过计数;你真正传递的是你希望计数开始的某种标记。