如何在更新查询中使用STRING_SPLIT()?

时间:2019-05-06 05:26:52

标签: sql-server

我想更新一个表,它的一个字段是用逗号分隔的值,我想更新那个表,我厌倦了不同的代码但不能正常工作

UPDATE [PATS].[ReportSubscription]
   SET [ScheduleID] = @ScheduleID
      ,[ReferenceID] = @ReferenceID
      ,[ReferenceType] = @ReferenceType
      ,[Schedule] = @Schedule
      ,[Day] = @Day
      ,[Time] = @Time
      ,[ProjectID] = @ProjectID
      ,[LastSentDate] = @LastSentDate
      ,[UserID] = @UserID
      --,[CreatedBy] = @CreatedBy
      --,[CreatedDate] = @CreatedDate
      ,[UpdatedBy] = @UpdatedBy
      ,[UpdatedDate] = @UpdatedDate
  WHERE ID=@ID AND @Day IN (SELECT * FROM STRING_SPLIT(@Day,','))

我认为此(SELECT * FROM STRING_SPLIT(@Day,','))应该与代码结合在一起。

enter image description here

3 个答案:

答案 0 :(得分:0)

您应该从value返回的表中选择STRING_SPLIT

WHERE ID=@ID AND [Day] IN (SELECT value FROM STRING_SPLIT(@Day,','))

此外,您应该将表的列[Day]与CSV列表进行比较,而不是变量@Day的。

但是,将CSV数据与SQL数据库混合通常不是一个好主意。如果可能,请考虑将您的CSV天列表存储在单独的表格中。

答案 1 :(得分:0)

变量中的数据可能有空格。 您应该从value返回的表格中选择STRING_SPLIT,并修剪用于条件的值,例如:

DECLARE @day NVARCHAR(500) = N'12 , 25,    41,54   ,89'
IF '41' IN (SELECT RTRIM(LTRIM(value)) FROM STRING_SPLIT(@Day,','))
    PRINT('Ok')
ELSE
    PRINT('Not Found')

-- printed : 'Ok'

答案 2 :(得分:0)

您的查询将是:

UPDATE [PATS].[ReportSubscription]
   SET [ScheduleID] = @ScheduleID
  ,[ReferenceID] = @ReferenceID
  ,[ReferenceType] = @ReferenceType
  ,[Schedule] = @Schedule
  ,[Day] = @Day
  ,[Time] = @Time
  ,[ProjectID] = @ProjectID
  ,[LastSentDate] = @LastSentDate
  ,[UserID] = @UserID
  ,[CreatedBy] = @CreatedBy
  ,[CreatedDate] = @CreatedDate
  ,[UpdatedBy] = @UpdatedBy
  ,[UpdatedDate] = @UpdatedDate
  WHERE ID=@ID AND Day IN (SELECT value FROM STRING_SPLIT(@Day,','))

访问https://docs.microsoft.com/en-us/sql/t-sql/functions/string-split-transact-sql?view=sql-server-2017了解更多信息。 注意:请确保相应地修剪不需要的空格