Вы не предоставили набор данных и набор результатов для проверки, но, как почти всегда, курсор нужен редко. Вместо этого вы можете использовать запросы для достижения того же результата.
Я не знаю, сработает ли это, но следующее близко соответствует тому, что вы написали:
DECLARE @Modules TABLE (
ID INT IDENTITY(1, 1)
,ListElid VARCHAR(4000)
,ListType VARCHAR(30)
,orderArray VARCHAR(4000)
,LeftTSMKEY VARCHAR(30)
,OrderedList INT
)
INSERT INTO @Modules (
ListElid
,ListType
,orderArray
,LeftTSMKEY
,OrderedList
)
SELECT ListElid
,ListType
,orderArray
,LeftTSMKEY
,ROW_NUMBER() OVER (partition by ListType order by ListType,orderArray) - 1 as OrderedList
FROM QAT_ListElid
I ведите временную таблицу, но добавьте одно поле OrderedList , чтобы сохранить переменную @ в c на уровне строк. это простой счетчик, который начинается с 0 и переинициализируется каждый раз при изменении ListType.
INSERT [QAT_ListElid2] (
[ListElid]
,[ListType]
,[orderArray]
,[LeftTSMKEY]
)
SELECT ListElid
,ListType
,orderArray
,LeftTSMKEY + CAST(OrderedList AS NVARCHAR(10)) + ']'
FROM @Modules
WHERE OrderedList <> orderArray
Затем достаточно просто вставить в таблицу результатов QAT_ListElid2 все значения, но только если наши расчетные значения отличаются от orderArray .
Я считаю, что это то, чего вы хотите достичь. Если не совсем, вы можете адаптироваться к вашим требованиям. Суть в том, чтобы доказать, что вы можете жить без курсоров и повысить производительность.