Estou tentando preencher minha tabela de banco de dados com alguns dados fictícios e escrevi um loop para isso. Estou usando o DBeaver para conectar-me ao meu banco de dados SQL Server e executo o código nele.
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;
Por algum motivo, recebo um erro na linha 3 (no loop WHILE).
Erro SQL [137] [S0002]: Deve declarar a variável escalar "@counter"
O que eu fiz errado?
O problema é o DBeaver, e não o seu SQL. DBeaver, quando usado com T-SQL, vê um ponto e vírgula (
;
) como um separador de lote e não como um terminador de instrução , apesar de ser definido como um "terminador de instrução" nas configurações.Como resultado deste comportamento indesejado (bug), isso significa que mesmo um lote simples como o seguinte irá falhar:
No SSMS, seria como escrever o seguinte:
(2
GO
s propositalmente, pois o DBeaver também trata uma linha em branco como um separador de lotede instruções.)Em vez disso, você precisará alterar suas preferências em Editores>Editor SQL>Processamento SQL. O método que usei para obter o comportamento normal do T-SQL foi:
GO
Isso significa que o script acima funcionou e ocorreu um erro em um segundo lote que
@test
não foi definido, e o "intelisense" na tela também pareceu apresentar o comportamento correto. Captura de telaIncluir exemplos de DDL e DML tornará isso muito mais fácil de resolver. Considerar:
DECLARE @Table TABLE (Column1 INT, Column2 DATE, ...); INSERT INTO @Table (Column1, Column2, ...) VALUES (1, '2024-01-01', ...), (2, '2024-02-01', ...);
Além disso, conforme mencionado nos comentários, é uma prática inadequada usar [N]Varchar sem comprimento.
Não consegui reproduzir seu problema, mas considere:
Isso gera uma expressão de tabela comum com 1.000 linhas e, em seguida, seleciona a partir dela com sua concatenação de strings para inserir em uma tabela fictícia.
SQL não funciona bem com loops e é melhor evitá-los sempre que possível. A regra geral é que se você estiver usando um cursor, provavelmente não está fazendo isso da melhor maneira.
Você pode simplesmente selecionar em uma tabela do sistema, por exemplo,
syscomments
e usarrownumber()
para simplificar bastante e fazer uma única inserção. Acredito queconcat
foi introduzido em 2012 também.