【问题标题】:Insert incremental value to table向表中插入增量值
【发布时间】:2020-05-07 17:02:57
【问题描述】:

我需要在名为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         |
+-------------+-----------+

【问题讨论】:

  • “更好”的字符串拆分器将为每个返回的 Item 返回一个 ItemNumber,例如Jeff Moden's。顺序重要吗?如果是这样,请注意String_Split 说“输出行可能是任何顺序。顺序保证与输入字符串中子字符串的顺序匹配。”

标签: sql-server csv tsql sql-insert sql-server-2016


【解决方案1】:

您可以使用ROW_NUMBER 和提供序列顺序的fkProductID 列进行更新。

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

UPDATE cte
SET SortValue = rn;

【讨论】:

  • 谢谢,但问题是,我不能准确地说出这样的字符串188,189,190,因为该字符串可以是188,190,180,在这种情况下,如果我使用像您的代码这样的查询会出错事情先生。因为我们通过fkProductID订购它
【解决方案2】:

您正在使用的 SQL Server 2016 引入了table-valued function string_split()。我建议使用它而不是您的自定义解析器。

最重要的是,您可以直接在您的insert 语句中使用row_number(),这样您就可以通过单个查询获得所需的结果:

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, ',')

【讨论】:

  • 我试过你的代码,错误显示Invalid object name 'string_split'.。我的数据库compatibility_level 是 100。我无法更改它,所以有其他方法可以做到这一点
  • 还有一件事先生,逗号分隔的字符串可以这样,193,191,190,189,192,188,194
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-11
  • 2015-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多