我的目的是为了实现将B表中的多条记录中的某个字段按照一定的规则连接成一个字符串字段和A表一块输出,有位大大给出了解决办法,但是那个格式太简单,我需要遍历整个查询,然后自己连接一个字符串出来,请问如何实现或者谁能变成输出下面的记录也行编号        内容                 备选项    23          我漂亮吗             A漂亮<br>B不漂亮
下面士那个自定义函数CREATE FUNCTION JoinGroup
(@id INT)
RETURNS VARCHAR(1000)
AS
BEGIN
DECLARE @s VARCHAR(8000)
SELECT @s=ISNULL(@s,'') + '*' + TextB FROM B表 WHERE BID=@ID
SET @s=STUFF(@s,1,1,'')
RETURN @s
END
SELECT AID,TextA,dbo.JoinGroup(AID) FROM A表

解决方案 »

  1.   

    晕,这是一样的,
    将SELECT @s=ISNULL(@s,'') + '*' + TextB FROM B表 WHERE BID=@ID
    这里的 * 换成 <BR> 即可。你真有分啊, 到处开散分贴
      

  2.   

    對呵,改掉這句SELECT @s=ISNULL(@s,'') + '*' + TextB FROM B表 WHERE BID=@ID即可,
    難道樓主還有特殊要求沒有說明??
    SELECT @s=ISNULL(@s,'') + '<BR>' + TextB FROM B表 WHERE BID=@ID
      

  3.   

    不一样啊,那个A,B,C是按照记录顺序生成的,记录中没有
      

  4.   

    在答案记录前面加标号,后面加<BR>,明白了吗
      

  5.   

    e,知道了。CREATE FUNCTION JoinGroup
    (@id INT,
    @j VARCHAR(100) --连接串
    )
    RETURNS VARCHAR(1000)
    AS
    BEGIN
    DECLARE @s VARCHAR(8000)
    DECLARE @i INT
    SET @i=0
    SELECT @s=ISNULL(@s,'') + @j +CHAR(i+65)+ TextB,@i=@i+1 FROM B表 WHERE BID=@ID
    SET @s=STUFF(@s,1,LEN(@j),'')
    RETURN @s
    ENDSELECT AID,TextA,dbo.JoinGroup(AID,'<BR>') FROM A表没测试,可能有手误。  另外, 当你 AID在B表中的数量过多时(超过26个)就不符合要求了
    因为英文字符只有26个。
    多过26时,你要给条件再怎么加序号。
      

  6.   

    从这个回贴
    ------------------
     fastson() ( ) 信誉:99  2006-07-22 15:12:00  得分: 0  
     
     
       不一样啊,那个A,B,C是按照记录顺序生成的,记录中没有
      
     
    -------------------我已经猜到你意思了,呵,果然没猜错。
      

  7.   

    @j是 JoinGroup的一个参数,你仔细看看。
      

  8.   

    @j是你想插入中間的字符串,執行的時候SELECT AID,TextA,dbo.JoinGroup(AID,'<BR>') FROM A表
      

  9.   

    ...,运行结果,
    23      我漂亮吗?      NULL
      

  10.   

    CREATE TABLE [dbo].[A] (
    [AID] [int] NULL ,
    [TextA] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL 
    ) ON [PRIMARY]
    GOCREATE TABLE [dbo].[B] (
    [BID] [int] NULL ,
    [AID] [int] NULL ,
    [TextB] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL 
    ) ON [PRIMARY]
      

  11.   

    我知道,是
    FROM B表 WHERE BID=@ID应该是AID=@ID
      

  12.   

    SQL里面有没有tryCatch语句阿,到时候真有了超过26个答案就返回个空字符串
      

  13.   

    有个手误
    CHAR(i+65)
    改为 CHAR(@i+65)不需要。
    可以用CASE WHEN解决SELECT @s=ISNULL(@s,'') + @j + (CASE WHEN @i>26 THEN ' ' ELSE CHAR(@i+65) END )+ TextB,@i=@i+1 FROM B表 WHERE ..
      

  14.   

    如果超過26的答案就不顯示的話,可以這麼改寫下。CREATE FUNCTION JoinGroup
    (@id INT,
    @j VARCHAR(100) --连接串
    )
    RETURNS VARCHAR(1000)
    AS
    BEGIN
    DECLARE @s VARCHAR(8000)
    Select @s=''
    DECLARE @i INT
    SET @i=0
    SELECT TOP 26 @s=@s+ @j +CHAR(@i+65)+ TextB,@i=@i+1 FROM B WHERE AID=@ID
    SET @s=STUFF(@s,1,LEN(@j),'')
    RETURN @s
    END
    GO
    SELECT AID,TextA,dbo.JoinGroup(AID,'<BR>') FROM A
      

  15.   

    我测试了一下,我这里执行正常CREATE TABLE A表
    (AID INT, TextA VARCHAR(100))
    INSERT A表 SELECT 23,'我漂亮吗'CREATE TABLE B表
    (ID INT IDENTITY(1,1),BID INT,TextB VARCHAR(100))
    INSERT B表(BID,TextB)
    SELECT 23,'漂亮'
    UNION SELECT 23,'不漂亮'
    --测试函数体
    DECLARE @j VARCHAR(100)
    SET @j='<BR>'
    DECLARE @id INT
    SET @id=23
    DECLARE @s VARCHAR(8000)
    DECLARE @i INT
    SET @i=0
    SET @s=''
    SELECT @s=ISNULL(@s,'') + @j +(CASE WHEN @i>26 THEN ' ' ELSE CHAR(@i+65) END )+ TextB,@i=@i+1 FROM B表 WHERE BID=@id
    SET @s=STUFF(@s,1,LEN(@j),'')
    SELECT @s
    DROP TABLE A表
    DROP TABLE B表/*结果
    A不漂亮<BR>B漂亮
    */
      

  16.   

    上班啊。不然我肯定不上CSDN。