?? 分割字符串.txt
字號(hào):
一存儲(chǔ)過(guò)程中有3個(gè)參數(shù)
如下:
ALTER PROCEDURE Pro_AddIDS(
@IDS varchar(255),
@IDName varchar(50),
@IDLevel int
)
其中@IDS="1,5,9,6,10"這樣的數(shù)據(jù),需要將這些數(shù)據(jù)分割出來(lái),插到一張表中結(jié)構(gòu)如下:
CREATE TABLE IDS
(
ID INT,
IDName VARCHAR(50),
IDLevel int
)
假設(shè):@IDS="1,5,9,6,10",IDName ="hello" 得到如下結(jié)果
/*
IDS IDName IDLevel
----------- --------------------------------------------------
1 hello null
5 hello null
9 hello null
6 hello null
10 hello null
請(qǐng)幫下忙,謝謝!
如何將'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
輸出結(jié)果:
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
李三 單位地址
(所影響的行數(shù)為 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
-- 建立一個(gè)輔助的臨時(shí)表就可以了
SELECT TOP 8000
id = identity(int,1,1)
INTO # FROM syscolumns a, syscolumns b
-- 這個(gè)輔助表是什么含義,為下一步鋪墊的目的是什么?
-- 以上生成一個(gè)臨時(shí)表
SELECT
A.PdID,
PdName = SUBSTRING(A.PdName, B.ID, CHARINDEX(',', A.PdName + ',', B.ID) - B.ID) --這個(gè)SUBSTRING在B.ID每一次執(zhí)行的時(shí)候的值是多少?
FROM tblTest A, # B
WHERE SUBSTRING(',' + a.PdName, B.id, 1) = ',' --這個(gè)where后面的檢索條件又代表什么含義?
ORDER BY 1,2
GO
DROP TABLE tblTest, #
即:
CREATE TABLE A(id INT,country VARCHAR(100))
INSERT A
SELECT 1,'中國(guó);日本;韓國(guó)' UNION ALL
SELECT 2,'美國(guó);意大利;法國(guó)' UNION ALL
SELECT 3,'德國(guó)'
SELECT * FROM A
-- 建立一個(gè)輔助的臨時(shí)表就可以了
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 中國(guó);日本;韓國(guó)
2 美國(guó);意大利;法國(guó)
3 德國(guó)
(所影響的行數(shù)為 3 行)
ID COUNTRY
----------- ---------
1 韓國(guó)
1 日本
1 中國(guó)
2 法國(guó)
2 美國(guó)
2 意大利
3 德國(guó)
(所影響的行數(shù)為 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
--調(diào)用:
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) --數(shù)據(jù)分隔符
set @IDSplit = ','
--創(chuàng)建分拆處理的輔助表(用戶定義函數(shù)中只能操作表變量)
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 #
--存儲(chǔ)過(guò)程
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
--調(diào)用
exec Pro_AddIDS '1,5,9,6,10','hello',null
--結(jié)果
select * from ids
ID IDName IDLevel
----------- -------------------------------------------------- -----------
1 hello NULL
5 hello NULL
9 hello NULL
6 hello NULL
10 hello NULL
(所影響的行數(shù)為 5 行)
--sqlserver 2005 鄒建的寫(xiě)法
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
--------------------------------
執(zhí)行
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
(所影響的行數(shù)為 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)
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -