Хорошо, мы «будем использовать» курсор, но мы будем пассивно-агрессивными в комментариях для тех, кто сказал вам использовать курсор здесь:
--This whole script should just be the first select used to define the cursor
DECLARE @firstname varchar(50)
DECLARE @lastname varchar(50)
DECLARE @salary int
--But we've been told to use a cursor
CREATE TABLE #Result(FirstName varchar(50), LastName varchar(50), Salary int)
DECLARE zxcv CURSOR FOR
SELECT
CASE
WHEN LEN(FirstName) <= 5
THEN concat(FirstName, '_', LEN(FirstName))
ELSE
FirstName END,
LastName,
Salary FROM Persons;
OPEN zxcv
FETCH NEXT FROM zxcv
INTO @firstname, @lastname, @salary;
WHILE @@FETCH_STATUS = 0
BEGIN
--See how pointless the actions taken in the cursor loop are now?
INSERT INTO #Result (FirstName,LastName,Salary)
VALUES (@firstname,@lastname,@salary);
FETCH NEXT FROM zxcv
INTO @firstname, @lastname, @salary;
END
CLOSE zxcv;
DEALLOCATE zxcv;
--If for some odd reason, we do need this temp table, it should be a single INSERT ... SELECT
--using the above SELECT
SELECT * FROM #Result;
В отличие от вас, яочевидно, не используя странный SKU, где мы должны платить письмом за присвоение имен нашим переменным, поэтому я дал им более описательные имена (извиняюсь, когда я начинаю писать пассивно-агрессивный, выход из этого режима затруднен: -)
Проблемы в вашем подходе: а) Каждый SELECT
, который не назначает переменные, не задает курсор или не следует за INSERT
, будет генерировать отдельный набор результатов и б) Вы запрашиваете базуtable (вместо того, чтобы полагаться на другие переменные) внутри цикла курсора, поэтому добавляются другие строки, не связанные с текущей строкой.
Как указано в комментариях, этот должен просто быть:
SELECT
CASE
WHEN LEN(FirstName) <= 5
THEN concat(FirstName, '_', LEN(FirstName))
ELSE
FirstName END,
LastName,
Salary FROM Persons;
Или, если нам нужна временная таблица:
CREATE TABLE #Result(FirstName varchar(50), LastName varchar(50), Salary int)
INSERT INTO #Result (FirstName,LastName,Salary)
SELECT
CASE
WHEN LEN(FirstName) <= 5
THEN concat(FirstName, '_', LEN(FirstName))
ELSE
FirstName END,
LastName,
Salary FROM Persons;