【问题标题】:Splitting string in column in table which has multiple values into separate rows将表中具有多个值的列中的字符串拆分为单独的行
【发布时间】:2020-02-20 13:44:25
【问题描述】:

使用 SQL Server Management Studio 2016,我有一列,如果有分隔符 ;,那么我需要将值分成两个单独的行。

我可以将值拆分为单个值,但是当我需要对表中的列执行此操作时它不起作用

表值:

Server Environment
S23     PROD, DEV
S24     PROD

查询一:

 SELECT [server], STRING_SPLIT([Environment]), ';')
   FROM [[dbo].[serverstable]

查询二:

ECLARE @tags NVARCHAR(400), @Environment NVARCHAR(400)

SET @tags = (SELECT [Environment] FROM [dbo].[Servers] WHERE [SERVER] = 'S23')
SET @Environment = (SELECT [Environment] FROM [dbo].[Servers])

BEGIN

IF @Environment LIKE '%;%'

SELECT value

FROM STRING_SPLIT(@tags, ';')

IF  @Environment NOT LIKE '%;%'

SELECT @Environment

END

查询一错误:

'STRING_SPLIT' 不是可识别的内置函数名称。

查询二错误:

子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。

预期结果

Server Environment
S23     PROD
S23     DEV
S24     PROD

【问题讨论】:

  • SSMS 版本无关。您想知道服务器版本是什么(使用select @@version 查找)。 String_split 于 2016 年推出,要求兼容级别为 130 或更高。
  • 您说您的值是用分号 (;) 分隔的,但您的示例另有说明('PROD, DEV' 是逗号 (,) 分隔的)。但是,实际上,您应该修复您的设计;在数据库中存储分隔数据只是减慢速度的一种“简单”方法。
  • 我可以使用 SSMS 2017 连接到 SQL Server 2000。不代表我使用的是 SQL Server 2017。
  • 好的,请忽略 SSMS 版本,是的,我的意思是写 'prod;开发'。请您能专注于帮助我解决问题,将不胜感激。我无法更改存储方法,因为我不是这方面的决策者,因此需要处理现有数据
  • 我们需要知道您的 SQL Server 版本才能启动,@RyanB。

标签: sql split


【解决方案1】:

split_string返回值是table,所以不能作为列使用

SELECT [server], STRING_SPLIT([Environment]), ';')
FROM [[dbo].[serverstable]

因此:它会给你这个错误:

您需要的是:cross join t1.environment

 SELECT [server], t2.value
 FROM [dbo].[serverstable] t1
 CROSS APPLY STRING_SPLIT(t1.[Environment], ';') t2

【讨论】:

  • 那个答案是正确的,假设服务器版本实际上是2016或更高,并且数据库的兼容级别为130或更高。但是,问题似乎暗示了其他情况,因为 OP 报告错误“'STRING_SPLIT' 不是可识别的内置函数名称。”。
  • @ZoharPeled,如果你使用 string_split 作为列,它会给你'STRING_SPLIT' is not a recognized built-in function name.,请试一试。
  • 我的立场是正确的。赞成您的答案,因为您似乎是正确的。
猜你喜欢
  • 2023-01-31
  • 1970-01-01
  • 1970-01-01
  • 2012-11-26
相关资源
最近更新 更多