大家好,小弟碰到一个比较难解决的问题,
  我想用 T-SQL 语句 来实现 读取一个表的某行记录的某个字段值
  然后付给变量
  我写的是 select @a=[字段1] from Table where ...
  但是 如果查出来 n 条记录的话 
  @a 的值只是最后一条记录的值
  我怎么样都获得出来,然后付给不同的变量??~
  
  哪位高手帮帮忙~~~
  万分感谢~~~

解决方案 »

  1.   

    set @a = ''
    select @a= @a + [字段1] + ';' from Table where ...返回去有多个用;号隔开的数据
    你在前台去处理好了
      

  2.   

    不会用游标,你也可以先求出满足结果的记录有多少条.
    然后用While循环读取前台处理方法同:hb_gx(高升)
      

  3.   

    hb_gx(高升)
    这位朋友的方法挺好,
    但是我觉得有个问题,
    如果数据量很大的话就不行了~谢谢上面两个朋友“游标”的点提~~juntor() 这位朋友,我不懂怎么在 T-SQL 里怎么使用 While循环将记录一一取出~
      

  4.   

    declare 游标名称 cursor for 
    select.........你要查询的字段 from 要查找的表
    open 游标名称
    fetch next from 游标名称 into 变量列表-- 和select 里面的列数对应
    while @@fetch_status =0
    begin 
      .......
      --你要处理的代码
      fetch next from 游标名称 into 变量列表-- 和select 里面的列数对应
    end 
    close 游标名称
    deallocate 游标名称
      

  5.   

    A. 使用简单游标和语法
    打开该游标时所生成的结果集包括 pubs 数据库的 authors 表中的所有行和列。可以更新该游标,对该游标所做的所有更新和删除均在提取中表现出来。因为没指定 SCROLL 选项,FETCH NEXT 是唯一可用的提取选项。DECLARE authors_cursor CURSOR
       FOR SELECT * FROM authors
    OPEN authors_cursor
    FETCH NEXT FROM authors_cursorB. 使用嵌套游标生成报表输出
    下例显示如何嵌套游标以生成复杂的报表。为每个作者声明内部游标。SET NOCOUNT ONDECLARE @au_id varchar(11), @au_fname varchar(20), @au_lname varchar(40),
       @message varchar(80), @title varchar(80)PRINT "-------- Utah Authors report --------"DECLARE authors_cursor CURSOR FOR 
    SELECT au_id, au_fname, au_lname
    FROM authors
    WHERE state = "UT"
    ORDER BY au_idOPEN authors_cursorFETCH NEXT FROM authors_cursor 
    INTO @au_id, @au_fname, @au_lnameWHILE @@FETCH_STATUS = 0
    BEGIN
       PRINT " "
       SELECT @message = "----- Books by Author: " + 
          @au_fname + " " + @au_lname   PRINT @message   -- Declare an inner cursor based   
       -- on au_id from the outer cursor.   DECLARE titles_cursor CURSOR FOR 
       SELECT t.title
       FROM titleauthor ta, titles t
       WHERE ta.title_id = t.title_id AND
       ta.au_id = @au_id   -- Variable value from the outer cursor   OPEN titles_cursor
       FETCH NEXT FROM titles_cursor INTO @title   IF @@FETCH_STATUS <> 0 
          PRINT "         <<No Books>>"        WHILE @@FETCH_STATUS = 0
       BEGIN
          
          SELECT @message = "         " + @title
          PRINT @message
          FETCH NEXT FROM titles_cursor INTO @title
       
       END   CLOSE titles_cursor
       DEALLOCATE titles_cursor
       
       -- Get the next author.
       FETCH NEXT FROM authors_cursor 
       INTO @au_id, @au_fname, @au_lname
    ENDCLOSE authors_cursor
    DEALLOCATE authors_cursor
    GO-------- Utah Authors report --------
     
    ----- Books by Author: Anne Ringer
             The Gourmet Microwave
             Is Anger the Enemy?
     
    ----- Books by Author: Albert Ringer
             Is Anger the Enemy?
             Life Without Fear
      

  6.   

    谢谢brother2605(幽灵) 这位朋友,我怎么给分啊??~,得分旁边没有怎么没有填写的文本框了~~~??~
      

  7.   

    呵呵,
    根据楼主所说的要求.我的理解是还是不要用游标
    如果数据不会太多,应该用 hb_gx(高升)
    所提到的方法.把@a定义成varchar(8000),可以存8000个字符呢.如果实在不够长的话.
    那你就直接写 select 列中 from 表名 where 条件
    在数据库中把符合条件的记录全部选出来.到程序中获取整个表集.再进行你要的处理..你在要求中写到"赋给不同的变量".
    其实是有问题的.你不知道会有多少结果
    也就不知道要定义多少个变量.
    从且也就不好接收了.呵呵,不知道我有不有理解错楼主的意思.
      

  8.   

    多谢juntor()兄提醒,我的赋值给不同变量的意思是说,好像前台页面定义数组一样,但是sql 是不支持数组的,我就不知道怎么办了~
      

  9.   

    要是我的话.我会把符合要求的记录全部取出来.
    (select 列名 from 表名 where 条件)然后到前台循环读取返回的结果集作处理就行了.呵呵
      

  10.   

    cn_tigers(不是我)的嵌套游标报表藐视可以用表连接写成一个游标。
    ------------------------------------------------------------
    我觉得还是用游标吧,
    select @sss= @sss+col from ttt
    这种可能由于记录数的数量多导致@sss变量长度不够,通用性不够好。
    (少量数据的列转行除外)