由于没有标量变量,SQL 循环无效?

问题描述 投票:0回答:1

我正在尝试用一些虚拟数据填充我的数据库表,并为此编写了一个循环。我正在使用 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”

我做错了什么?

sql sql-server sql-server-2012 dbeaver
1个回答
0
投票

包含示例 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 不太适合循环,最好尽可能避免它们。经验法则是,如果您发现自己在使用光标,那么您可能没有以最佳方式进行操作。

© www.soinside.com 2019 - 2024. All rights reserved.