У меня есть БД, которая создает записи для пользователей, и они могут создавать новые версии этих записей. Я отслеживаю старые записи, поэтому дифференцирую их, добавив столбец (VARCHAR (20)) в моей БД, в котором хранится версия данных. Я создал хранимую процедуру, которая принимает строки, соответствующие идентификатору пользователя, и упорядочивает версии в строке с версиями, разделенными '|'. Это работало некоторое время, но недавно пользователь создал 10-ую версию, и почему-то этот поток, кажется, нарушается. Ниже приведен SP:
DECLARE @IN_vsId VARCHAR(100)
SET @IN_vsId='user1'
SELECT @Version_str = COALESCE(@Version_str + '|', '') + VSN_NO
FROM (
SELECT TOP 100 VSN_NO
FROM table1 myTable
WHERE myTable.ID = @IN_vsId
ORDER BY myTable.VSN_NO ASC
)VERSION_TBL
PRINT @Version_str
Когда у пользователя было <9 версий, строка выглядела бы как <code>1|2|3|4|5|6|7|8|9. Однако после создания 10-й версии она выглядит как 1|10|2|3|4|5|6|7|8|9
. Я в недоумении здесь. Мой бэкэнд полагается на получение длины списка (я конвертирую его в список, как только я вернусь с моего SP) и выбор последнего индекса, который в этом случае всегда будет равен 9. Я могу изменить это в бэкэнде, просто получив max int из списка, но я хочу посмотреть, смогу ли я сначала изменить свою БД.
EDIT Ответы пока работают хорошо,за исключением того, что у меня было несколько версий с буквой «P» перед определенными типами пользовательских данных. Я добавил оператор if else для определения, будет ли строка иметь версию 'P', а затем сделал:
DECLARE @Version_str VARCHAR(100)
DECLARE @IN_vsId VARCHAR(100)
DECLARE @IN_vsType VARCHAR(100)
SET @IN_vsId='user1'
IF @IN_vsType='DRAFT'
BEGIN
SELECT @Version_str = COALESCE(@Version_str + '|', '') + VSN_NO
FROM (
SELECT TOP 100 VSN_NO
FROM table1 myTable
WHERE myTable.ID = @IN_vsId
AND myTable.TYPE_NM = @IN_vsType
)VERSION_TBL ORDER BY TRY_CAST(VSN_NO AS INT) ASC
END
IF @IN_vsType='PUBLISH'
BEGIN
SELECT @Version_str = COALESCE(@Version_str + '|', '') + VSN_NO
FROM (
SELECT TOP 100 VSN_NO
FROM table1 myTable
WHERE myTable.ID = @IN_vsId
AND myTable.TYPE_NM = @IN_vsType
)VERSION_TBL ORDER BY TRY_CAST(SUBSTRING(VSN_NO, 2, LEN(VSN_NO)) AS INT) ASC
END
PRINT @Version_str
В случае P я создаю подстроку, которая удаляет P, и приведучисла как int, как я их заказываю