Funcția SQL REPLICATE() nu replică și returnează o singură instanță a șirului furnizat atunci când este atribuită unei variabile (Programare, Server Sql, Tsql, Variabile, Bucla While, Replicate)

Ash Edwards a intrebat.

În prezent, încerc să rezolv o provocare de programare SQL (construirea unei structuri triunghiulare folosind caractere asterisc). Exemplu de ieșire de mai jos (3 rânduri);

* * * 
* *
*

Am scris un cod care cred că ar trebui să funcționeze (provenind dintr-o experiență de hobby în C#, deci s-ar putea să abordez acest lucru într-un mod complet greșit). Cu toate acestea, utilizarea de către mine a REPLICATE() pare să scoată la ieșire doar o singură dată caracterul/șirul de caractere furnizat, fără a replica efectiv.

Am furnizat codul meu actual aici:

DECLARE @n INT = 3;
DECLARE @output NVARCHAR;
DECLARE @nextLine NVARCHAR;
DECLARE @char NVARCHAR = '* ';

WHILE @n > 0
BEGIN
    SET @nextLine = REPLICATE(@char, @n);
    SET @output = CONCAT(@output, @nextLine, CHAR(10));
    SET @n = @n - 1;
END

PRINT TRIM(@output);

Ieșirea așteptată:

* * * 
* *
*

Ieșire curentă reală:

*

Pentru a clarifica/reiterarea într-un mod diferit;

SELECT REPLICATE(@char, @n);
SET @output = REPLICATE(@char, @n);
SELECT @output;

Primul SELECT de mai sus returnează rezultatul așteptat (un șir de caractere precum „* * * * * * * ….’), însă al doilea SELECT – care încearcă să seteze această valoare ca valoare a unei variabile, reține doar un singur asterisc (‘‘). De ce?

Comentarii

  • Declararea [N]VARCHAR câmpuri fără o lungime este o un obicei prost de care trebuie să te debarasezi, și explică rezultatele aparent „greșite”. –  > Por Jeroen Mostert.
  • Mulțumesc @JeroenMostert care a rezolvat problema. Foarte interesant și articolul. –  > Por Ash Edwards.
1 răspunsuri
ch2019

Declară lungimea parametrului @output și @nextLine.

DECLARE @output NVARCHAR(50);
DECLARE @nextLine NVARCHAR(50);

Comentarii

  • Mulțumesc @ch2019, asta a fost problema! 🙁 –  > Por Ash Edwards.