Вставить инкрементное значение в таблицу - PullRequest
3 голосов
/ 07 мая 2020

Мне нужно вставить строковое значение, разделенное запятыми, в таблицу с именем productsort. Моя структура таблицы выглядит следующим образом

+-------------+-----------+
| fkProductID | SortValue |
+-------------+-----------+
|             |           |
+-------------+-----------+ 

У меня есть настраиваемая функция разделения, которую я использовал для разделения значений из строки, разделенной запятыми

DECLARE @Var VARCHAR(4000);
SET @Var = '188,189,190,191,192,193,194'

-- Insert statement
INSERT INTO productsort(fkProductID)
    SELECT * FROM dbo.fnSplitStringToIds(@Var,',')

Вышеуказанный запрос работает нормально и после таблицы вставки данные следующим образом:

+-------------+-----------+
| fkProductID | SortValue |
+-------------+-----------+
| 188         |           |
| 189         |           |
| 190         |           |
| 191         |           |
| 192         |           |
| 193         |           |
| 194         |           |
+-------------+-----------+

Теперь мне нужно вставить инкрементное значение в SortValue столбец, мне нужен следующий результат:

+-------------+-----------+
| fkProductID | SortValue |
+-------------+-----------+
| 188         | 1         |
| 189         | 2         |
| 190         | 3         |
| 191         | 4         |
| 192         | 5         |
| 193         | 6         |
| 194         | 7         |
+-------------+-----------+

Как я могу это сделать ?

Обновлено:

Строка, разделенная запятыми, может иметь вид 193,191,190,189,192,188,194. В таком случае мой ожидаемый результат должен быть

+-------------+-----------+
| fkProductID | SortValue |
+-------------+-----------+
| 193         | 1         |
+-------------+-----------+
| 191         | 2         |
+-------------+-----------+
| 190         | 3         |
+-------------+-----------+
| 189         | 4         |
+-------------+-----------+
| 192         | 5         |
+-------------+-----------+
| 188         | 6         |
+-------------+-----------+
| 194         | 7         |
+-------------+-----------+

Ответы [ 2 ]

1 голос
/ 07 мая 2020

SQL Сервер 2016, который вы используете, представил возвращающую табличное значение функцию string_split(). Я бы рекомендовал использовать его вместо вашего собственного парсера.

Вдобавок к этому, вы можете использовать row_number() непосредственно в своем операторе insert, чтобы получить желаемый результат с помощью одного запроса:

declare @var varchar(4000);
set @var =  '188,189,190,191,192,193,194'

insert into productsort(fkProductID, sortValue)
select value, row_number() over(order by value) 
from string_split(@var, ',')
1 голос
/ 07 мая 2020

Вы можете выполнить обновление, используя ROW_NUMBER со столбцом fkProductID, указывающим порядок последовательности.

WITH cte AS (
    SELECT fkProductID, ROW_NUMBER() OVER (ORDER BY fkProductID) rn
    FROM productsort
)

UPDATE cte
SET SortValue = rn;
...