使用逗号分隔值的MS SQL更新语句

时间:2016-09-16 16:40:03

标签: sql sql-server tsql

我正在尝试创建一个SQL Update语句,该语句将在文本框字段&中读取逗号分隔值。使用这些以逗号分隔的值更新表(1列引用ID)。

具体来说,我有一个产品表,我想创建一个表格来更新该表中的“库存”列。

我每天都会更新我的广告资源电子表格,如果我可以将所有产品的广告资源的CSV复制/粘贴到文本框点击更新并让我的表格实现,那就太棒了。

我不确定如何执行此操作,因为我需要引用每个产品的唯一ID,并使用库存库存的匹配值更新该ID。

任何想法,例子都受到高度赞赏。

2 个答案:

答案 0 :(得分:0)

如果您使用的是SQL Server 2016,那么您可以使用我在上面评论中所述的string_split

select * from string_split('1,2,3,4,5',',')

然而:

如果您使用的是早期版本的sql server< 2016年,您可以创建一个返回表的函数,然后从那里加入您需要更新的表:

CREATE FUNCTION dbo.SplitStringToValues
(
   @List NVARCHAR(MAX),
   @Delimiter NVARCHAR(255)
)
RETURNS TABLE
WITH SCHEMABINDING AS
RETURN
  WITH E1(N)        AS ( SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 
                         UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 
                         UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1),
       E2(N)        AS (SELECT 1 FROM E1 a, E1 b),
       E4(N)        AS (SELECT 1 FROM E2 a, E2 b),
       E42(N)       AS (SELECT 1 FROM E4 a, E2 b),
       cteTally(N)  AS (SELECT 0 UNION ALL SELECT TOP (DATALENGTH(ISNULL(@List,1))) 
                         ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E42),
       cteStart(N1) AS (SELECT t.N+1 FROM cteTally t
                         WHERE (SUBSTRING(@List,t.N,1) = @Delimiter OR t.N = 0))
  SELECT Item = SUBSTRING(@List, s.N1, ISNULL(NULLIF(CHARINDEX(@Delimiter,@List,s.N1),0)-s.N1,8000))
    FROM cteStart s;
go

然后使用像这样的功能

SELECT * FROM SplitStringToValues('1,2,3,5',',') as t

更新:

要获得您在评论中询问的ID旁边的下一行值,您可以执行以下操作。它使用SQL SERVER 2012中引入的LEAD函数:

SELECT Id, Value
FROM   (SELECT 
               ROW_NUMBER() over (order by(select 1)) as cnt,
               t.item AS Id, 
               Lead(t.item) 
                 OVER ( 
                   ORDER BY (SELECT 1)) Value 
        FROM   dbo.Splitstringtovalues('10,20,30,40,50,10,20,30,40,50,60,70', ',') 
               t) 
       keyValue 
WHERE  keyValue.value IS NOT NULL 
and cnt % 2 = 1 

答案 1 :(得分:0)

如果您使用的是SQL Server 2016,则可以使用string_split

select * from string_split('1,2,3,4,5',',')