将字符串拆分为字符上的子字符串并将其转换为多行SQL

时间:2015-06-18 08:27:51

标签: sql sql-server

我有下表:

+--------+-----------------+
|  Code  |      Input      |
+--------+-----------------+
| 151821 | 687 235 563     |
| 123521 | 657 089 568 798 |
+--------+-----------------+

我希望能够做的是在SQL视图中的空格字符上拆分“输入”字符串(然后填充excel查询)以创建如下内容:

+--------+-------+
|  Code  | Input |
+--------+-------+
| 151821 |   687 |
| 151821 |   235 |
| 151821 |   563 |
| 123521 |   657 |
| 123521 |   089 |
| 123521 |   568 |
| 123521 |   798 |
+--------+-------+

我知道我可以在Excel级别使用空格上的SPLIT函数进行一些VBA,但希望有可能在SQL中使用它。

2 个答案:

答案 0 :(得分:0)

您可能必须创建一个SQL FUNCTION或类似的东西,因为实际上没有任何内置的本机SQL方法可以执行此操作。

答案 1 :(得分:0)

我在互联网上发现这个并且已经使用它几个月来将逗号分隔值作为字符串传递并将其拆分为记录。希望你可以重做它或做类似的事情。

CREATE FUNCTION [dbo].[fn_MVParam_Split] (@RepParam nvarchar(4000), @Delim1 char(1)= ',', @Delim2 char(1)= '|') 
RETURNS @Values TABLE 
(
Param1 nvarchar(4000),
Param2 nvarchar(4000)
)
AS

BEGIN

DECLARE @chrind INT
DECLARE @chrind2 INT
DECLARE @Piece nvarchar(100) 
DECLARE @PieceLeft nvarchar(100) 
DECLARE @PieceRight nvarchar(100) 

SELECT @chrind = 1 
WHILE @chrind > 0 
BEGIN

  SELECT @chrind = CHARINDEX(@Delim1,@RepParam) 
  IF @chrind  > 0 
    SELECT @Piece = LEFT(@RepParam,@chrind - 1) 
  ELSE

    SELECT @Piece = @RepParam 

  SELECT @chrind2 = CHARINDEX(@Delim2,@Piece)

  IF @chrind2  > 0 
  BEGIN
    SELECT @PieceLeft = LEFT(@Piece,@chrind2 - 1)       
    SELECT @PieceRight = RIGHT(@Piece,LEN(@Piece) - @chrind2)       
  END
  ELSE
  BEGIN
    SELECT @PieceLeft = @Piece
    SELECT @PieceRight = ''
  END

  INSERT  @Values(Param1, Param2) VALUES(CAST(@PieceLeft AS VARCHAR), CAST(@PieceRight AS VARCHAR)) 
  SELECT @RepParam = RIGHT(@RepParam,LEN(@RepParam) - @chrind) 
  IF LEN(@RepParam) = 0 BREAK

END

RETURN

END