⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 分割字符串.txt

📁 SQL语句集锦,很多精彩的语句,希望深入SQL的朋友可以研究一下.
💻 TXT
字号:
一存储过程中有3个参数
如下:
ALTER  PROCEDURE Pro_AddIDS(
@IDS varchar(255),
@IDName varchar(50),
@IDLevel int
)
其中@IDS="1,5,9,6,10"这样的数据,需要将这些数据分割出来,插到一张表中结构如下:
CREATE TABLE IDS
(
  ID INT,
  IDName VARCHAR(50),
  IDLevel int
)
假设:@IDS="1,5,9,6,10",IDName ="hello" 得到如下结果
/*
IDS         IDName       IDLevel                                      
----------- -------------------------------------------------- 
1           hello          null
5           hello          null
9           hello          null
6           hello          null
10          hello          null

请帮下忙,谢谢!


如何将'2006-01-12|2006-02-13|2006-03-15|2006-11-11|2003-1-1'按'|'分割成
2006-01-12
2006-02-13
2006-03-15
2006-11-11
2003-1-1


declare @Days varchar(4000)
declare @tmpDay varchar(10)
set @Days='2006-01-12|2006-02-13|2006-03-15|2006-11-11|2003-1-1'
set @tmpDay=''
declare @i int
set @i=0
while @i<len(@Days)
begin 
  set @i=@i+1
  if SUBSTRING(@Days,@i,1)='|'
     begin
       print left(@Days,@i-1)
       set @Days=SUBSTRING(@Days,@i+1,len(@Days))
       set @i=0
     end  
end
print @Days


输出结果:
2006-01-12
2006-02-13
2006-03-15
2006-11-11
2003-1-1



一字段信息包括如下:李三|李三@d.com|公司|单位地址|  
我将查询用(Select)只列出李三及单位地址的方法?

create table #t(c1 varchar(100))
insert into #t select 'li4|33@com|mircrosoft|china|'
insert into #t select 'zhang3|zhang3@163.com|IBM|USA|'
insert into #t select '李三|李三@d.com|公司|单位地址|'


select substring(c1,1,charindex('|',c1)-1) as name, 
reverse(substring(reverse(c1) , 2 , charindex('|' , reverse(c1) , 2) - 2)) as address  from #t

drop table #t

name    address   
-----   -------
li4     china
zhang3  USA
李三    单位地址

(所影响的行数为 3 行)


declare @s varchar(20)
set @s='06G512753-08-01'  
select 
    parsename(t.s,3) part1,
    parsename(t.s,2) part2,
    parsename(t.s,1) part3
from 
    (select replace(@s,'-','.') as s) t



参考:

create table tblTest(PdID int,PdName varchar(100))

insert tblTest
select 1,'A10'           union all
select 2,'A20,A20S'      union all
select 3,'A30,A30K,A30M' union all
select 4,'A301'          union all
select 5,'A301M'
select * from tblTest
go

-- 建立一个辅助的临时表就可以了
SELECT TOP 8000 
id = identity(int,1,1) 
INTO # FROM syscolumns a, syscolumns b   
-- 这个辅助表是什么含义,为下一步铺垫的目的是什么?
-- 以上生成一个临时表
 
SELECT 
    A.PdID, 
    PdName = SUBSTRING(A.PdName, B.ID, CHARINDEX(',', A.PdName + ',', B.ID) - B.ID) --这个SUBSTRING在B.ID每一次执行的时候的值是多少?
FROM tblTest A, # B
WHERE SUBSTRING(',' + a.PdName, B.id, 1) = ','    --这个where后面的检索条件又代表什么含义?
ORDER BY 1,2
GO

DROP TABLE tblTest, #


即:

CREATE TABLE A(id INT,country VARCHAR(100))
INSERT A
SELECT 1,'中国;日本;韩国' UNION ALL
SELECT 2,'美国;意大利;法国' UNION ALL
SELECT 3,'德国'
SELECT * FROM A

-- 建立一个辅助的临时表就可以了
SELECT TOP 8000 id = identity(int,1,1) 
INTO # FROM syscolumns a, syscolumns b   

 
SELECT 
    A.ID, 
    COUNTRY = SUBSTRING(A.COUNTRY, B.ID, CHARINDEX(';', A.COUNTRY + ';', B.ID) - B.ID) 
FROM A, # B
WHERE SUBSTRING(';' + a.COUNTRY, B.id, 1) = ';'   
ORDER BY 1,2
GO

DROP TABLE A,#

id          country         
----------- ----------------
1           中国;日本;韩国
2           美国;意大利;法国
3           德国

(所影响的行数为 3 行)

ID          COUNTRY  
----------- ---------
1           韩国
1           日本
1           中国
2           法国
2           美国
2           意大利
3           德国

(所影响的行数为 7 行)




declare @sql varchar(8000)
set @sql=replace(@Ids,',',','''+@IDName+''' union all select ')+','''+@IDName+''''

exec('insert IDS(IDS,IDName) select '+@sql )



CREATE TABLE IDS(IDS INT,IDNAME VARCHAR(50),IDLevel INT)
go

create procedure sp_test(@str varchar(8000),@IDName varchar(50),@IDLevel int)
as
begin
    while charindex(',',@str)>0
    begin
        insert into IDS(IDS,IDNAME,IDLevel) select left(@str,charindex(',',@str)-1),@IDName,@IDLevel
        set @str=stuff(@str,1,charindex(',',@str),'')
    end
    insert into IDS(IDS,IDNAME,IDLevel) select @str,@IDName,@IDLevel
end
go

exec sp_test '1,2,3,4,5,9','Hello',NULL

select * from IDS
/*
IDS         IDNAME                                             IDLevel     
----------- -------------------------------------------------- ----------- 
1           Hello                                              NULL
2           Hello                                              NULL
3           Hello                                              NULL
4           Hello                                              NULL
5           Hello                                              NULL
9           Hello                                              NULL
*/
go

drop procedure sp_test
drop table IDS
go


--sqlserver 2000;
CREATE FUNCTION [dbo].[f_splitToTable] (@p_StringList VARCHAR(1000),@flag char(1)=',')
RETURNS @t TABLE (s VARCHAR(10))
AS
BEGIN
	DECLARE @ib int,@ie int
	set @p_StringList=ltrim(rtrim(@p_StringList))
  if left(@p_StringList,1)=@flag set @p_StringList=right(@p_StringList,len(@p_StringList)-1)
  if right(@p_StringList,1)<>@flag set @p_StringList=@p_StringList+@flag
	select @ib=0,@ie=0
  select @ie=charindex(@flag,@p_StringList,@ib+1)
	WHILE @ie > 0
	BEGIN
		insert into @t select substring(@p_StringList,@ib+1,@ie-@ib-1)
		select @ib=@ie,@ie=charindex(@flag,@p_StringList,@ib+1)
	END	
	RETURN
END

--调用:
select @IDName,s from dbo.f_splitToTable(@IDS,',')



create  PROCEDURE Pro_AddIDS(
@IDS varchar(255),
@IDName varchar(50),
@IDLevel int = null
)
as
begin
      declare @IDSplit varchar(10)     --数据分隔符
      set @IDSplit = ','
      --创建分拆处理的辅助表(用户定义函数中只能操作表变量)
      DECLARE @t TABLE(ID int IDENTITY,b bit)
      declare @re TABLE(col varchar(10),IDName varchar(50),IDlevel int)
      INSERT @t(b) SELECT TOP 8000 0 FROM syscolumns a,syscolumns b

      INSERT @re SELECT SUBSTRING(@IDS,ID,CHARINDEX(@IDSplit,@IDS+@IDSplit,ID)-ID),@IDName,@IDLevel
      FROM @t
      WHERE ID<=LEN(@IDS+'a') 
            AND CHARINDEX(@IDSplit,@IDSplit+@IDS,ID)=ID
      select * from @re
END
GO


exec Pro_AddIDS '1,5,9,6,10','hello'
go
drop proc Pro_AddIDS
/*
col        IDName                                             IDlevel     
---------- -------------------------------------------------- ----------- 
1          hello                                              NULL
5          hello                                              NULL
9          hello                                              NULL
6          hello                                              NULL
10         hello                                              NULL
*/


--建表
CREATE TABLE IDS
(
  ID INT,
  IDName VARCHAR(50),
  IDLevel int
)
go

drop table #

--存储过程
create  PROCEDURE Pro_AddIDS
@IDS varchar(255),
@IDName varchar(50),
@IDLevel int

as

create table # (
ids int
)

declare @sql varchar(8000)
set @sql=replace(@IDS,',',' union all select ')

exec('insert # select '+@sql )

insert Ids
select ids,@IDName,@IDLevel from #

drop table #

go

--调用
exec Pro_AddIDS '1,5,9,6,10','hello',null

--结果
select * from ids

ID          IDName                                             IDLevel     
----------- -------------------------------------------------- ----------- 
1           hello                                              NULL
5           hello                                              NULL
9           hello                                              NULL
6           hello                                              NULL
10          hello                                              NULL

(所影响的行数为 5 行)



--sqlserver 2005 邹建的写法
SELECT b.s,@IDName   
FROM(SELECT CONVERT(xml,'<r><v>'+REPLACE(@IDS,',','</v><v>') + '</v></r>') x) a
OUTER APPLY(SELECT s=N.v.value('.', 'varchar(100)') FROM a.x.nodes('/r/v') N(v)) b




Create PROCEDURE Pro_AddIDS(
@IDS varchar(255),
@IDName varchar(50),
@IDLevel int
)
as
Set Nocount on

Select Top 500 identity(int,1,1) as ident into #Table_Pqs from syscolumns as pqs,syscolumns as pqh

Select Substring(Pqh.IDS,Pqs.ident,charindex(',',Pqh.IDS+',',Pqs.ident) - Pqs.ident) As [ID],@IDName As IDName ,@IDLevel As IDLevel 
from  (Select @IDS as IDS) as Pqh,#Table_Pqs as Pqs
Where Substring(','+Pqh.IDS,Pqs.ident,1)=',' 

drop table #Table_Pqs
go

--------------------------------
执行 
Pro_AddIDS '1,5,9,6,10','hello',null
--------------------------------
                                                                                                                                                                                                                                                  ID IDName      IDLevel     
-------------------------------- 
1  hello	NULL	
5  hello	NULL	
9  hello	NULL	
6  hello	NULL	
10 hello	NULL	





CREATE TABLE #
(
  ID INT,
  IDName VARCHAR(50),
  IDLevel int
)

declare @var nvarchar(4000)

set @var='insert into # select '''+ REPLACE ('1,1,1,2,3,4,5',',',''',@IDName,@IDLevel union all select''')+''',@IDName,@IDLevel'

execute sp_executesql @var,N'@IDName varchar(50), @IDLevel int',@IDName='hello',@IDLevel=null


select * from #


ID          IDName                                             IDLevel     
----------- -------------------------------------------------- ----------- 
1           hello                                              NULL
1           hello                                              NULL
1           hello                                              NULL
2           hello                                              NULL
3           hello                                              NULL
4           hello                                              NULL
5           hello                                              NULL

(所影响的行数为 7 行)




CREATE TABLE #
(
  ID INT,
  IDName VARCHAR(50),
  IDLevel int
)

alter PROCEDURE Pro_AddIDS(
@IDS varchar(255),
@IDName varchar(50),
@IDLevel int
)
as
declare @var nvarchar(4000)
set @var='insert into # select '''+ REPLACE (@IDS,',',''',@IDNames,@IDLevels union all select''')+''',@IDNames,@IDLevels'
execute sp_executesql @var,N'@IDNames varchar(50), @IDLevels int',@IDNames=@IDName,@IDLevels=@IDLevel



exec Pro_AddIDS '1,2,54,6,7,43,3','how','1'


select * from #

ID          IDName                                             IDLevel     
----------- -------------------------------------------------- ----------- 
1           how                                                1
2           how                                                1
54          how                                                1
6           how                                                1
7           how                                                1
43          how                                                1
3           how                                                1




declare @str varchar(1000)

select @str='insert into ids select '+replace('1,5,9,6,10',',',',''hello'',null union all select  ')+',''hello'',null'
exec(@str)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -