【问题标题】:Varchar value split in SQLSQL中的varchar值拆分
【发布时间】:2017-01-01 11:48:44
【问题描述】:

我在表格中有一个列

表 1

Tid.   name   fid
-----------------
 1.    Abc.   233
 2.    def.   344
 3.    xyz.   455

表 2

did.   Status.   name                   FID
-------------------------------------------
 1      Open.        Abu,def,xyz            233,344,455

现在我想将这些 fid 和 name 从 table2 中拆分为这样的存储过程:

ID   status   name   FID
---------------
 1.   Open.     Abc.   233
 2.    Open.    Def.   344
 3    Open.     xyz.   455 

更新存储过程

查询:

Create procedure as splitdata 
As 
Begin 
   Declare @fid varchar (500) 

   Select name, select item as fid 
   from spiltstring(@fid,',')) 
   from table1 
   Inner join table2 on table1.fid = table2.fid

这显示错误

将 varchar 值 '233,344,455' 转换为数据类型 int 时转换失败

在 table1 中 fidint 并且在 table2 fidvarchar 类型。

分割字符串函数是

CREATE FUNCTION SplitString
(    
      @Input NVARCHAR(MAX),
      @Character CHAR(1)
)
RETURNS @Output TABLE (Item NVARCHAR(1000))
AS
BEGIN
      DECLARE @StartIndex INT, @EndIndex INT

      SET @StartIndex = 1

      IF SUBSTRING(@Input, LEN(@Input) - 1, LEN(@Input)) <> @Character
      BEGIN
            SET @Input = @Input + @Character
      END

      WHILE CHARINDEX(@Character, @Input) > 0
      BEGIN
            SET @EndIndex = CHARINDEX(@Character, @Input)

            INSERT INTO @Output(Item)
            SELECT SUBSTRING(@Input, @StartIndex, @EndIndex - 1)

            SET @Input = SUBSTRING(@Input, @EndIndex + 1, LEN(@Input))
      END

      RETURN
END
GO

我该怎么做?

更新

好的,根据@john 解决方案我试试这个解决方案...

但是因为我有多个其他表

喜欢

Create procedure as sp2
    @tick int
As
    Select
        Table 4.column, Table 5.column, Table 3.column,
        --so here I used solution like this
        (Select b.fid 
         from table2 t2 
         cross apply 
             (Select fid = s2.retval 
              from [udf-str-parase] (t2.fid, ',') s2) b),
        Table 6.column
    From 
        Table 2
    Inner join 
        table4 on table4.id = table5.id
    ..........
    Where 
        tick = @tick

当我尝试只执行交叉应用查询时,这显示了完美的结果

但是当我尝试像这样执行整个存储过程时

Exec sp2 28

我收到此错误:

子查询返回超过 1 个值。这是不允许的。当子查询跟随 =,!=,=,>,

有什么解决办法吗?

【问题讨论】:

  • 请检查。更新

标签: sql-server tsql split


【解决方案1】:

split/parse 函数和 CROSS APPLY 的帮助

Declare @Table2 table (did int,Status varchar(50),name varchar(50),FID varchar(50))
Insert Into @Table2 values
(1,'Open.','Abu,def,xyz','233,344,455')


Select ID = Seq
      ,A.Status
      ,B.Name
      ,B.FID
 From  @Table2 A
 Cross Apply (
         Select Name=S1.RetVal
               ,FID =S2.RetVal
               ,Seq =S1.RetSeq
          From [dbo].[udf-Str-Parse](A.Name,',') S1
          Join [dbo].[udf-Str-Parse](A.FID,',')  S2
            on S1.RetSeq=S2.RetSeq
       ) B

返回

ID  Status  Name    FID
1   Open.   Abu     233
2   Open.   def     344
3   Open.   xyz     455

如果需要,拆分/解析 UDF

CREATE FUNCTION [dbo].[udf-Str-Parse] (@String varchar(max),@Delimiter varchar(10))
Returns Table 
As
Return (  
    Select RetSeq = Row_Number() over (Order By (Select null))
          ,RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)')))
    From  (Select x = Cast('<x>'+ replace((Select @String as [*] For XML Path('')),@Delimiter,'</x><x>')+'</x>' as xml).query('.')) as A 
    Cross Apply x.nodes('x') AS B(i)
);
--Select * from [dbo].[udf-Str-Parse]('Dog,Cat,House,Car',',')
--Select * from [dbo].[udf-Str-Parse]('John Cappelletti was here',' ')
--Select * from [dbo].[udf-Str-Parse]('this,is,<test>,for,< & >',',')

【讨论】:

  • 这太复杂了
  • 请检查更新问题...我尝试您的解决方案,这显示错误
  • 不会因为你不懂@cooluser而太复杂
猜你喜欢
  • 2015-02-02
  • 2018-10-12
  • 1970-01-01
  • 2014-09-09
  • 2010-11-21
  • 2015-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多