Sql 从2个符号中分割数据

Sql 从2个符号中分割数据,sql,sql-server,Sql,Sql Server,有桌子吗 CREATE TABLE #tbl ( id int identity(1,1), obj_type int , obj_id nvarchar(50) ) 有如下数据:153:0 | 114:0 | 147:0 | 148:0 | 152:0 | 155:0 要在之前插入哪些数据:“到对象id,哪些数据在旁边:”插入对象类型。一定是这样 id obj_type obj_id 1 0 153 2

有桌子吗

CREATE TABLE #tbl 
(
   id int identity(1,1),
   obj_type int ,
   obj_id nvarchar(50)
)
有如下数据:153:0 | 114:0 | 147:0 | 148:0 | 152:0 | 155:0 要在之前插入哪些数据:“到对象id,哪些数据在旁边:”插入对象类型。一定是这样

id       obj_type     obj_id
1           0           153
2           0           114
3           0           147
4           0           148
5           0           152
6           0           155

如何在存储过程中实现它?不起作用

您可以等待一些专家的回答 在那之前你可以给它一次机会

insert into #tbl 
SELECT LEFT(splitdata, CHARINDEX(':', splitdata) - 1) AS obj_id, 
       RIGHT(splitdata, CHARINDEX(':', REVERSE(splitdata)) - 1) AS obj_type from (select splitdatafrom fnSplitString(parameterName,'|')
现在您可以像这样编写stringsplit函数


创建函数[dbo].[fnSplitString]
( 
@字符串NVARCHAR(最大值),
@分隔符字符(1)
) 
返回@output TABLE(splitdata-NVARCHAR)(最大值)
) 
开始
声明@start INT、@end INT
选择@start=1、@end=CHARINDEX(@delimiter、@string)
而@start
声明@S varchar(100)='153:0 | 114:0 | 147:0 | 148:0 | 152:0 | 155:0'
声明@xml
选择@xml=''+replace(replace(@s',:'',''),'|','')+''
选择N.value('value[1],'int')作为对象id,
N.value('value[2],'int')作为对象类型
从@xml.nodes('item')作为T(N)
另一种解决方案:

Create FUNCTION [dbo].[SplitString]
    (
        @List NVARCHAR(MAX),
        @Delim VARCHAR(255)
    )
    RETURNS TABLE
    AS
        RETURN ( SELECT [Value] FROM 
          ( 
            SELECT 
              [Value] = LTRIM(RTRIM(SUBSTRING(@List, [Number],
              CHARINDEX(@Delim, @List + @Delim, [Number]) - [Number])))
            FROM (SELECT Number = ROW_NUMBER() OVER (ORDER BY name)
              FROM sys.all_objects) AS x
              WHERE Number <= LEN(@List)
              AND SUBSTRING(@Delim + @List, [Number], LEN(@Delim)) = @Delim
          ) AS y
        );
创建过程[dbo]。[Insert_过程]
@inputString varchar(最大值)
作为
开始
设置@inputString='2153:770 | 114:0 | 147:0 | 148:0 | 152:0 | 155:0'声明@delimiter char(1)='|'声明@delimiter_冒号char(1)=':'
DECLARE@chIndex int DECLARE@chIndex1 int DECLARE@item varchar(100)DECLARE@ReverseString varchar(max)
选择@ReverseString=Reverse(子字符串(Reverse(@inputString),1,1))
如果(@ReverseString'|')
设置@inputString=@inputString+“|”
而CHARINDEX(@delimiter,@inputString,0)0
开始
设置@chIndex=CHARINDEX(@delimiter,@inputString,0)
选择@item=SUBSTRING(@inputString,1,@chIndex-1)
如果LEN(@item)>0
开始
设置@chIndex1=CHARINDEX(@delimiter\u冒号,@item,0)
Declare@obj_type int Declare@obj_id varchar(50)
选择@obj_id=SUBSTRING(@item,@chIndex1+1,len(@item))选择@obj_type=SUBSTRING(@item,1,@chIndex1-1)
插入测试(obj_类型,obj_id)值(@obj_类型,@obj_id)
结束
选择@inputString=SUBSTRING(@inputString,@chIndex+1,LEN(@inputString))
结束
结束

好奇为什么不使用纯函数存储过程?感谢您的回答,当我尝试此操作时出现错误无效列名“splitdata”,我在我的回答中执行FUNQCION我有splitdata,从一起,这可能是原因,分离它们split data是split函数返回的列,因此,您可以单独测试返回2行splidata列名的函数
declare @S varchar(100) = '153:0|114:0|147:0|148:0|152:0|155:0'

declare @xml xml

select @xml = '<item><value>'+replace(replace(@s, ':','</value><value>'), '|','</value></item><item><value>')+'</value></item>'

select N.value('value[1]', 'int') as obj_id,
       N.value('value[2]', 'int') as obj_type
from @xml.nodes('item') as T(N)
Create FUNCTION [dbo].[SplitString]
    (
        @List NVARCHAR(MAX),
        @Delim VARCHAR(255)
    )
    RETURNS TABLE
    AS
        RETURN ( SELECT [Value] FROM 
          ( 
            SELECT 
              [Value] = LTRIM(RTRIM(SUBSTRING(@List, [Number],
              CHARINDEX(@Delim, @List + @Delim, [Number]) - [Number])))
            FROM (SELECT Number = ROW_NUMBER() OVER (ORDER BY name)
              FROM sys.all_objects) AS x
              WHERE Number <= LEN(@List)
              AND SUBSTRING(@Delim + @List, [Number], LEN(@Delim)) = @Delim
          ) AS y
        );
Declare 
@Text varchar (100) = '153:0|114:0|147:0|148:0|152:0|155:0',
@Delim varchar(50) = ':0|'

select case when CHARINDEX(':0', Value) > 0 then Left(Value, Len(Value)-2) else Value   End AS Result  from dbo.SplitString(@Text, @Delim) 
CREATE procedure   [dbo].[Insert_procedure] 
    @inputString varchar(max)
    AS
    BEGIN   
    set @inputString  ='2153:770|114:0|147:0|148:0|152:0|155:0' Declare @delimiter char(1) = '|' Declare @delimiter_Colon char(1) = ':' 
    DECLARE @chIndex int DECLARE @chIndex1 int DECLARE @item varchar(100)Declare @ReverseString varchar(max)    
    SELECT @ReverseString =   Reverse(substring(reverse(@inputString), 1, 1))
    IF(@ReverseString <> '|')
    set @inputString = @inputString +'|'    
    WHILE CHARINDEX(@delimiter, @inputString, 0) <> 0
        BEGIN            
            SET @chIndex = CHARINDEX(@delimiter, @inputString, 0)            
            SELECT @item = SUBSTRING(@inputString, 1, @chIndex - 1)           
            IF LEN(@item) > 0
                BEGIN
                 set @chIndex1 = CHARINDEX(@delimiter_Colon, @item, 0)
                 Declare @obj_type int Declare @obj_id varchar(50)
                 SELECT @obj_id = SUBSTRING(@item, @chIndex1+1,len(@item)) SELECT @obj_type = SUBSTRING(@item,1,@chIndex1-1)                  
                 Insert into TEST(obj_type,obj_id) values (@obj_type,@obj_id)                                                                             
                END           
            SELECT @inputString = SUBSTRING(@inputString, @chIndex + 1, LEN(@inputString))
        END
   END