CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
英特尔®游戏设计大赛100美元现金周周送 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  疑难问题

横竖转换问题

楼主wy_whb()2003-12-03 10:49:46 在 MS-SQL Server / 疑难问题 提问

我要做一个质检分析  
  质检原因表的字段有reason_id,   reason_name  
  质检单的字段有custom_id,   reason_id  
  我现在要做一个质检分析  
  格式如下:  
  custom_id     reason_name1,reason_name2,   .........  
  关键问题:  
  1、原因表的记录条数不确定,我要动态创建列  
  2、记录原来是竖排的,现在要搞成横排  
  请问大力等高手,如何实现这样的sql语句呢?多谢!  
  一定给分!  
  问题点数:0、回复次数:3Top

1 楼mywhsw(bamboo)回复于 2003-12-03 10:59:57 得分 0

--可以参考一下下面的,  
  --建立表  
  DECLARE   CUR_A   CURSOR   FOR     SELECT   NAME   FROM   SYSOBJECTS   WHERE   XTYPE='U'     and   name   not   in('dtproperties','B_COL_DISTRIBUTE')  
  DECLARE   @TABLENAME   VARCHAR(50)  
  DECLARE   @TMPSTR   VARCHAR(8000)  
  declare   @TMPSTR2   Varchar(8000)  
  open   CUR_A  
     
  FETCH     NEXT     FROM   CUR_A   INTO     @TABLENAME  
  SET   @TMPSTR=''  
  SET   @TMPSTR2=''  
  WHILE   @@FETCH_STATUS   =   0   BEGIN  
  SET @TMPSTR=@TMPSTR+@TABLENAME   +'   VARCHAR(2)   NULL,'+CHAR(13)  
   
  SET @TMPSTR2=@TMPSTR2+  
  'CONSTRAINT   [DF_B_COL_DISTRIBUTE_'+@TABLENAME+']   DEFAULT   ('''')   FOR   ['+@TABLENAME+'],'  
    +CHAR(13)  
    FETCH     NEXT     FROM   CUR_A   INTO   @TABLENAME      
  END  
  SET   @TMPSTR=('  
  create   table   B_COL_DISTRIBUTE  
  (  
  COL_NAME   VARCHAR(50)   NULL,  
  COL_MEMO   VARCHAR(50)   NULL,  
  '+SUBSTRING(@TMPSTR,1,(LEN(@TMPSTR)-2))+')'+char(13)+  
  'ALTER   TABLE   B_COL_DISTRIBUTE   WITH   NOCHECK   ADD    
  CONSTRAINT   [DF_B_COL_DISTRIBUTE_COL_NAME]   DEFAULT   ('''')   FOR   [COL_NAME],    
  CONSTRAINT   [DF_B_COL_DISTRIBUTE_COL_MEMO]   DEFAULT   ('''')   FOR   [COL_MEMO],'+char(13)+  
  +SUBSTRING(@TMPSTR2,1,(LEN(@TMPSTR2)-2))+   char(13)   )  
   
  EXEC   ('if   exists   (select   *   from   dbo.sysobjects   where   id   =   object_id(N''[dbo].[B_COL_DISTRIBUTE]'')   and   OBJECTPROPERTY(id,   N''IsUserTable'')   =   1)  
  drop   table   [dbo].[B_COL_DISTRIBUTE]  
  ')  
  EXECUTE   (   @TMPSTR)  
  --PRINT   @TMPSTR  
  CLOSE   CUR_A  
  DEALLOCATE   CUR_A  
  go  
   
  ---插入记录  
  DECLARE   CUR_B   CURSOR   FOR      
  SELECT   DISTINCT    
              t2.name   AS   COLNAME,   CONVERT(varchar,   t4.[value])   AS   COLMEMO  
  FROM   dbo.sysproperties   t4   RIGHT   OUTER   JOIN  
              dbo.systypes   t3   RIGHT   OUTER   JOIN  
              dbo.syscolumns   t2   ON   t3.xtype   =   t2.xtype   RIGHT   OUTER   JOIN  
              dbo.sysobjects   t1   ON   t2.id   =   t1.id   ON   t4.id   =   +   t1.id   AND    
              t4.smallid   =   +   t2.colid    
  WHERE   (t1.xtype   =   'U'   and   t1.name     not   in('dtproperties','B_COL_DISTRIBUTE'))  
  DECLARE   @COL_NAME   VARCHAR(1000)  
  DECLARE   @COL_MEMO   VARCHAR(1000)  
     
  DECLARE   @TBL_NAME   VARCHAR(1000)  
   
   
  open   CUR_B  
     
  FETCH     NEXT     FROM   CUR_B   INTO     @COL_NAME,@COL_MEMO  
     
  WHILE   @@FETCH_STATUS   =   0   BEGIN  
     
  INSERT   INTO   B_COL_DISTRIBUTE   (COL_NAME,COL_MEMO)   VALUES   (@COL_NAME,isnull(@COL_MEMO,''))  
     
  DECLARE   CUR_C   CURSOR   FOR    
  SELECT   t1.name    
  FROM   dbo.sysobjects   t1   INNER   JOIN  
              dbo.syscolumns   t2   ON   t1.id   =   t2.id   INNER   JOIN  
              dbo.systypes   t3   ON   t2.xtype   =   t3.xtype   LEFT   OUTER   JOIN  
              dbo.sysproperties   t4   ON   t1.id   =   t4.id   AND   t2.colid   =   t4.smallid  
  WHERE   (t1.xtype   =   'U')   and   (t2.name=@COL_NAME     )   and     t1.name     not   in('dtproperties','B_COL_DISTRIBUTE')    
  open   CUR_C  
  FETCH     NEXT     FROM   CUR_C   INTO   @TBL_NAME  
  WHILE   @@FETCH_STATUS   =   0   BEGIN  
  exec('UPDATE   B_COL_DISTRIBUTE   SET     '+@TBL_NAME+'=''√''   WHERE   COL_NAME='''+@COL_NAME+'''')  
  FETCH     NEXT     FROM   CUR_C   INTO   @TBL_NAME  
  END  
  CLOSE   CUR_C  
  DEALLOCATE   CUR_C  
   
    FETCH     NEXT     FROM   CUR_B   INTO       @COL_NAME,@COL_MEMO  
  END  
  CLOSE   CUR_B  
  DEALLOCATE   CUR_B  
   
     
  Top

2 楼CrazyFor(冬眠的鼹鼠)回复于 2003-12-03 11:02:04 得分 0

能不能把N个reason_name组合成分隔符分隔的一个字符串呢,这样做就比较方便,你那样不太好做.Top

3 楼wy_whb()回复于 2003-12-03 11:12:05 得分 0

你这样做我感觉太繁了,能否有更加简练的做法呢?Top

相关问题

  • 转换???
  • 转换
  • 转换
  • 转换
  • 转换
  • 类的转换
  • 类型转换!
  • 怎样转换????????
  • 字符转换
  • 数值转换

关键词

  • null
  • tmpstr
  • col
  • 质检
  • distribute
  • reason
  • tablename
  • cur
  • varchar
  • fetch

得分解答快速导航

  • 帖主:wy_whb

相关链接

  • SQL Server类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo