我正在尝试用一些虚拟数据填充我的数据库表,并为此编写了一个循环。我正在使用 DBeaver 连接到我的 SQL Server 数据库,然后针对它运行代码。
DECLARE @counter INT = 1;
WHILE @counter <= 1000
BEGIN
INSERT INTO dbo.Articles
(ArticleCode, ArticleName)
VALUES
('ARTCODE' + CAST(@counter AS VARCHAR), 'Name' + CAST(@counter AS VARCHAR))
;
SET @counter = @counter + 1;
END;
由于某种原因,我在第 3 行(在 WHILE 循环上)收到错误。
SQL 错误 [137] [S0002]:必须声明标量变量“@counter”
我做错了什么?
包含示例 DDL 和 DML 将使这个问题更容易解决。考虑:
DECLARE @Table TABLE (Column1 INT, Column2 DATE, ...); INSERT INTO @Table (Column1, Column2, ...) VALUES (1, '2024-01-01', ...), (2, '2024-02-01', ...);
此外,正如评论中提到的,使用没有长度的 [N]Varchar 是不好的做法。
我无法重现您的问题,但请考虑:
DECLARE @TempTable TABLE(ArticleCode VARCHAR(30), ArticleName VARCHAR(50));
;WITH n AS (
SELECT 1 AS n
UNION ALL
SELECT n+1
FROM n
WHERE n < 1000
)
INSERT INTO @TempTable
SELECT 'ARTCODE' + CAST(n AS VARCHAR(20)), 'Name' + CAST(n AS VARCHAR(45))
FROM n
OPTION (MAXRECURSION 1000);
这会生成一个包含 1000 行的公共表表达式,然后使用字符串连接从中进行选择以插入到虚拟表中。
SQL 不太适合循环,最好尽可能避免它们。经验法则是,如果您发现自己在使用光标,那么您可能没有以最佳方式进行操作。