CREATE FUNCTION f_str(
@sbbh VARCHAR(2),
@sbmc VARCHAR(10),
@cj VARCHAR(10),
@pz VARCHAR(10),
@num INT,
@Height INT)
RETURNS VARCHAR(1000)
AS
BEGIN
    DECLARE @s VARCHAR(1000)
    SELECT @s=ISNULL(@s + ',','')  --这儿有问题
--改成?    SELECT @s=ISNULL(@s,'') + ',','') 

解决方案 »

  1.   

        SELECT @s=ISNULL(@s + ',','') + cast (isnull(person,'') as varchar) FROM tb
            WHERE sbbh=@sbbh AND sbmc=@sbmc AND cj=@cj AND pz=@pz AND num=@num AND height=@height條件不成立為null改為
    RETURN isnull(@s,'')
      

  2.   

    别老说我的语句有问题你提问时需求都不一样..null哪来的?一,连表取不到右端输入,值为 null二, 语句不返回行,行集为空,因此得到 null三,表里字段值本身为null由于你表里字段值不为null,那就只有这两种可能,表是你自己的,连表是你自己加上去的,自己调调就是了,别老一个贴子发个n遍, 别人回了然后就说不行, 也没人知道你问题在哪。
      

  3.   

    函数里
    SELECT DISTINCT  @s = ...
      

  4.   

    呵呵,sql的null判断好象不是...
      

  5.   


    大哥,我已经改成SELECT DISTINCT  @s = ...。但还是有点问题呀。可能我当时没有表述清楚。
    下面的测试数据如下: 
    设备编号  设备名称  车间      品种  只数  重量  生产人员 
    01      磨毛机    磨毛车间  磨毛  20    200  李宁 
    01      磨毛机    磨毛车间  磨毛  20    200  李宁 
    01      磨毛机    磨毛车间  磨毛  20    200  孙悦 
    01      磨毛机    磨毛车间  磨毛  20    200  孙悦 
    运行你写的语句结果如下: 
    设备编号  设备名称  车间      品种  只数  重量  
    01      磨毛机    磨毛车间  磨毛  20    200 
    生产人员 李宁(我改成SELECT DISTINCT  @s = ...。后运行的结果。但孙悦不会显示。) 我要求正确的运行结果是这样的。如下:设备编号  设备名称  车间      品种  只数  重量  
    01      磨毛机    磨毛车间  磨毛  20    200 
    生产人员 李宁,孙悦
    请问大哥,从你写的语句如何修改成这样的效果呀!谢谢了。
      

  6.   

    你写的语句:
    IF OBJECT_ID('tb','u') IS NOT NULL
        DROP TABLE tb
    GO
    CREATE TABLE tb(sbbh VARCHAR(2),sbmc VARCHAR(10),cj VARCHAR(10),pz VARCHAR(10),num INT,height INT,person VARCHAR(10))
    INSERT tb SELECT '01',      '磨毛机',    '磨毛车间' , '磨毛',  20    ,200,  '小明'
    UNION ALL SELECT '01',      '磨毛机' ,   '磨毛车间',  '磨毛' , 20   , 200 , '小李'
    UNION ALL SELECT '01',      '磨毛机'  ,  '磨毛车间'  ,'磨毛'  ,30  ,  300  ,'小李'
    UNION ALL SELECT '02',      '定型机'   , '定型车间' , '定型' , 40 ,   400 , '小明'
    UNION ALL SELECT '02',      '定型机'    ,'定型车间',  '定型'  ,40,    400  ,'小芳'
    GOCREATE FUNCTION f_str(
    @sbbh VARCHAR(2),
    @sbmc VARCHAR(10),
    @cj VARCHAR(10),
    @pz VARCHAR(10),
    @num INT,
    @Height INT)
    RETURNS VARCHAR(1000)
    AS
    BEGIN
        DECLARE @s VARCHAR(1000)
        SELECT distinct @s=ISNULL(@s + ',','') + person FROM tb 
            WHERE sbbh=@sbbh AND sbmc=@sbmc AND cj=@cj AND pz=@pz AND num=@num AND height=@height
        RETURN @s
    END
    GO
    SELECT *,ID=IDENTITY(INT) INTO #1 FROM
        (SELECT DISTINCT sbbh,sbmc,cj,pz,num,height FROM tb) a
    SELECT ID=IDENTITY(INT),* INTO #2 FROM
        (SELECT DISTINCT sbbh,sbmc,cj,pz,num,height,dbo.f_str(sbbh,sbmc,cj,pz,num,height) v FROM tb) a
    GO
    SELECT sbbh,sbmc,cj,pz,num,height,idx=0,id FROM #1
    UNION
    SELECT '生产人员',v,NULL,NULL,NULL,NULL,idx=1,id FROM #2
    ORDER BY ID,idx
    /*
    01    磨毛机    磨毛车间    磨毛    20    200    0    1
    生产人员    小明,小李    NULL    NULL    NULL    NULL    1    1
    01    磨毛机    磨毛车间    磨毛    30    300    0    2
    生产人员    小李    NULL    NULL    NULL    NULL    1    2
    02    定型机    定型车间    定型    40    400    0    3
    生产人员    小明,小芳    NULL    NULL    NULL    NULL    1    3*/
    GO
    DROP FUNCTION f_str
    GO
    DROP TABLE #1,#2
    GO
      

  7.   


    呵呵,您的SQL版本,老版如2000的null判断好象有问题,有几种情况下就是不对的。