http://topic.csdn.net/u/20091102/02/47af08d2-5bb8-4ce6-ad1c-4c18a4d7e926.html
原贴,但仍未有解决
是这样,我需要一个函数,用于解决sql字符串传参时的拆分,我现在用的是set @k = charindex(',',@keye) while @k>=1
这种方法,但我认为我原有方法过于复杂重用性不高即每次需要重写一些细节代码,所以想求一个重用并重高效的函数,来处理这种情况, 函数sql_str (tabale 名称,tbale 字段 ,数据 ,拆分分割字符[]) 。拆分分割字符 最少为2个应为最少我也需要处理二次分解情况。
举例:
set tbaledata='sdf,df^2,5^3,8^4,9^d,bbb'
即对上面的字符拆分,最终结果是将 数据
col1 col2
------------ ------------------
sdf df
2 5
3 8
4 9
d bbb但注意tbale 字段是需要传参col1,col2,col3......即这可变的,原贴中只解决了固定col的情况,对于变动col没有较好的解决 。
原贴,但仍未有解决
是这样,我需要一个函数,用于解决sql字符串传参时的拆分,我现在用的是set @k = charindex(',',@keye) while @k>=1
这种方法,但我认为我原有方法过于复杂重用性不高即每次需要重写一些细节代码,所以想求一个重用并重高效的函数,来处理这种情况, 函数sql_str (tabale 名称,tbale 字段 ,数据 ,拆分分割字符[]) 。拆分分割字符 最少为2个应为最少我也需要处理二次分解情况。
举例:
set tbaledata='sdf,df^2,5^3,8^4,9^d,bbb'
即对上面的字符拆分,最终结果是将 数据
col1 col2
------------ ------------------
sdf df
2 5
3 8
4 9
d bbb但注意tbale 字段是需要传参col1,col2,col3......即这可变的,原贴中只解决了固定col的情况,对于变动col没有较好的解决 。
if object_id('tb') is not null
drop table tb
go
create table tb( id varchar(100))go
declare @s varchar(8000)
set @s='sdf,df^2,5^3,8^4,9^d,bbb'
insert tb
select
id=substring(@s, number, charindex('^', @s + '^', number) - number)
from master..spt_values
where type='p'
and substring(',' + @s,number,1) = '^'
select col1= substring(id,1,charindex(',',id)-1),col2=stuff(id,1,charindex(',',id),'') from tb/*
col1 col2
---------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2 5
3 8
4 9
d bbb(4 行受影响)
*/
declare @split varchar(2)
select @s='sdf,df^2,5^3,8^4,9^d,bbb',@split='^'
select left(substring(@s,number,charindex(@split,@s+@split,number)-number),
charindex(',',substring(@s,number,charindex(@split,@s+@split,number)-number))-1),
right(substring(@s,number,charindex(@split,@s+@split,number)-number),
len(substring(@s,number,charindex(@split,@s+@split,number)-number))-charindex(',',substring(@s,number,charindex(@split,@s+@split,number)-number)))
from master..spt_values
where type='p' and number<=len(@s+'a')
and charindex(@split,@split+@s,number)=number
/*
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
sdf df
2 5
3 8
4 9
d bbb(5 個資料列受到影響)*/
declare @s as varchar(200)
set @s='sdf,df^2,5^3,8^4,9^d,bbb';
select 'select '''+replace(replace(@s,',',''','''),'^',''' union all select ''')+''''
--创建分割字符串存储过程DivideString
CREATE PROCEDURE DivideString
(
@String NVARCHAR(1210), -- 要分隔的字符串
@SPLITCHAR NVARCHAR(10) = ',', -- 默认分隔字符
@TableName NVARCHAR(30) = 'table' --默认表名
)
AS
DECLARE @L INT -- 第一个分隔字符的位置
DECLARE @S INT -- 第二个分隔字符的位置
SET @L = 0
SET @S = CHARINDEX(@SPLITCHAR, @String, @L)WHILE @L <= LEN(@String)
BEGIN
DECLARE @ColName NVARCHAR(50)
IF @S = 0 SET @S = LEN(@String) + 1 -- 如果到最后一个字符串那么第二个分隔字符的位置就是这个字符串的长度加一
SET @ColName = SUBSTRING(@String, @L, @S - @L) -- 取值
SET @L = @S + 1
SET @S = CHARINDEX(@SPLITCHAR, @String, @L)
IF LTRIM(RTRIM(@ColName)) = '' CONTINUE -- 如果是空字符串就跳过
DECLARE @SQL NVARCHAR(1000)
SET @SQL ='INSERT INTO ' + @TableName + '(tcname) select ''' +@ColName+'''' --插入表的语句,根据自己需求修改
EXEC (@SQL)
--Print @sql
END
--使用
EXEC DivideString 'sdf,df^2,5^3,8^4,9^d,bbb',',','表名'
@s='sdf,df,a^2,5,a^3,8,a^4,9,a^d,bbb,a'
set @s='sdf,df,a^2,5,a^3,8,a^4,9,a^d,bbb,a';
set @s='select '''+replace(replace(@s,',',''','''),'^',''' union all select ''')+''''
exec(@s)
/*
---- ---- ----
sdf df a
2 5 a
3 8 a
4 9 a
d bbb a(5 個資料列受到影響)*/