教程学院
图像设计 多媒体类 机械制图 办公软件 操作系统 系统编程 网站编程 网页制作 数据库类 网络路由 网络工程 网络安全 考试认证
firefox火狐浏览器下载
酷网学院
CAD
AutoCad Cam350 ProEngineer GCcam MATLAB Unigraphics SolidWorks CAXA Solid3000 Cimatron EdgeCAM
系统
安全 防火墙 病毒 WinXP Win2003 Vista
数据库
编程
网络
精彩图库
  当前位置: 库库中文网 · 数据库类教程 · MSSQL教程 · MsSql综合技巧

求SQL返回split后横向表地 SqL

 
学院最新推荐文章
PS教程推荐
 
『求SQL返回split后横向表地 SqL』如果文章有大量图片,显示会较慢,请等待图片下载完成
 
作者:linco001 来源:C.S.D.N 点击数: 更新时间:2008-7-21 
想写个函数把一字段的分块。比如
colname
=========
1,2,3,4,5
----------
1,2,3

通过一个函数批处理,例 ff_split(@colname varchar(100),@splitchar varchar(5),@num int)

调用ff_split(colname,',',10)

想得到结果为

col1  col2  col3  col4  col5  col6  col7  col8  col9  col10
===================================
1    2    3    4    5    null  null  null  null  null
1    2    3    null  null  null  null  null  null  null


现在不知道不知道如何很好的实现ff_split(@colname varchar(100),@splitchar varchar(5),@num int)
望大侠们帮忙,谢谢

这个问题第1个回答:
固定是10列么?
这个问题第2个回答:
不好意思,看到了。
一般需要动态语句来完成,自定义函数中没法使用。
可以使用
SQL code



select ff_split(@colname varchar(100),@splitchar varchar(5),1), ff_split(@colname varchar(100),@splitchar varchar(5),2)




来选出第一列和第二列。

这个问题第3个回答:
如果你非要这样也不能一次性就可以
应该还要用到临时表来
这个问题第4个回答:
先分隔到临时表一下.再对临时表的数据进行操作.
这个问题第5个回答:
没办法一次性处理

分拆比较简单
分拆到列也比较简单

但 2000 中做不出那种可以针对每个列分拆到表后的join(与表值函数join)
2005 及之后的版本虽然可以, 但无法解决函数返回动态列的问题
这个问题第6个回答:
SQL code

用存储过程,@num小于字段中包含@split的个数时自行处理一下

CREATE TABLE sourTa(colname varchar(20))

INSERT INTO sourTa SELECT '1,2,3,4,5'

UNION ALL SELECT '1,2,3'



go 

CREATE PROC GetCol(

    @col varchar(10),

    @sp  varchar(10),

    @i   int

)

AS 

SET NOCOUNT ON 



DECLARE @s int

DECLARE @str varchar(1000)



IF object_id('aixTa') IS NOT NULL

    DROP TABLE aixTa

    

SET @str='CREATE TABLE aixTa('

SET @s=1

WHILE @s<=@i

BEGIN    

    SET @str = @str+@col+cast(@s AS varchar)+' varchar(10),'

    SET @s = @s+1

END

SET @str = LEFT(@str,len(@str)-1)+')'

EXEC (@str)



SELECT colname+replicate(',null',@i-l-1 ) colname INTO #

FROM   (

           SELECT colname,

                  len(colname)-len(replace(colname,@sp,'')) l

           FROM   sourTa

       ) st



EXEC master..xp_execresultset 'select ''insert aixTa SELECT ''+colname from #',N'test'



SELECT * FROM   aixTa

DROP TABLE #



go 

EXEC GetCol 'col',',',6



--result

/*col1       col2       col3       col4       col5       col6       

---------- ---------- ---------- ---------- ---------- ---------- 

1          2          3          4          5          NULL

1          2          3          NULL       NULL       NULL

*/


这个问题第7个回答:
为什么提示 ’master..xp_execresultset ’ 存储过程不存在
这个问题第8个回答:
up
这个问题第9个回答:
引用 7 楼 linco001 的回复:
为什么提示 ’master..xp_execresultset ’ 存储过程不存在

因为本来就没有这个东西.
这个问题第10个回答:
SQL code



--> 测试数据: @s

declare @s table (colname varchar(50))

insert into @s

select '1,2,3,4,5' union all

select '1,2,3'







create proc p_p

@colname varchar(500),

@num int

as

declare @sql varchar(1000)

if object_id('pp') is null

begin

    declare @i int

    SET @i=1

    WHILE @i<=@num

    BEGIN    

            SET @sql = isnull(@sql+',','create table pp(')+'col'+ltrim(@i)+' varchar(10)'

            SET @i = @i+1

    END

    set @sql=@sql+')'

end

set @colname=@colname+replicate(',',@num-len(@colname)+len(replace(@colname,',','')))

while(charindex(',,',@colname)>0)

    set @colname=replace(@colname,',,',','''',')

set @sql=isnull(@sql,'')+' insert into pp select '+left(@colname,len(@colname)-1)

exec(@sql)

select * from pp

go







exec p_p '1,2,3,4,5',10

exec p_p '1,2,3',10












】【关闭窗口
·上页:
·下页:
相关文章
 
     数据库类教程 - MsSql综合技巧
普通教程SQL Server 2008升级顾问
普通教程迁移 Reporting Services
普通教程SQL Server 2008升级报表服务器
普通教程SQL Server 2008 升级Reporting
普通教程SQL Server 2008示例之奥地利广
普通教程SQL Server 2008 示例之微软IT部
普通教程SQL Server 2008示例之日立咨询
普通教程SQL Server2008示例之CyberSavv
普通教程SQL Server 2008示例之CareGrou
普通教程微软商业智能技术详细解说
普通教程通过数据说明和生成报表整合企业
advertisement
关于站点 - 广告服务 - 联系我们 - 版权隐私 - 免责声明 - 合作伙伴 - 程序支持 - 网站地图 - 返回顶部
网站文本地图
版权所有:库库中文 2005-2007 欢迎各种媒体转载我们的原创作品[转载请注明出处]
copyright © 2005-2008 www.QQGB.com online services. all rights reserved. 蜀ICP备05015578
Template designed by Virus. Optimized for 1024x768 to Firefox,Opera and MS-IE6. Site powered by EQL.
红盾
热爱电脑,热爱生活
拥有电脑,拥有生命
让我们享受拥有电脑的时光