CREATE FUNCTION dbo.f_BOMChild(@BOM_NO Varchar(38))
    RETURNS @t TABLE(BOM_NO Varchar(38),PRD_NO Varchar(38),LVL INT)
AS
BEGIN
    DECLARE @lvl INT
    SET @lvl=1
    
    INSERT @t
        SELECT BOM_NO,PRD_NO,@lvl
        FROM TF_BOM
        WHERE BOM_NO=@BOM_NO
    
    WHILE @@ROWCOUNT>0
    BEGIN
        SET @lvl=@lvl+1
        
        INSERT @t
            SELECT
                A.BOM_NO,
                A.PRD_NO,
                @lvl
            FROM TF_BOM AS A
                JOIN @t AS B
                    ON A.BOM_NO=B.PRD_NO
                        AND B.lvl=@lvl-1
    END
    RETURN
END
=============================这是查询树结构表某个节点的子节点.上面的代码是CSDN上小梁写的.....
我的那个贴子地址为:
http://topic.csdn.net/u/20081222/14/0d538e84-ebe8-4009-8fa6-a2cdefafeafc.html?seed=1606339755我也自己写了一个函数.但两种方法都出现:"无法解决 equal to 操作的排序规则冲突"我看了我的字段的排序规则,都是 <数据库默认设置>, 如果把BOM_NO,PRD_NO  这两个字段改成数值类型就可以通过语法检查....
但问题的关键是,我的数据的内容都是非数值的字符...我问小梁,他说:"在FUNCTION的RETURNS的表变量时,列加上这个排序规则".可我以前从没用过这个"排序规则",所以请高手告诉我如何弄(我的字段的排序规则,都是 <数据库默认设置>)....急呀,搞了一天还没搞定,都快急死了............谢谢了.......

解决方案 »

  1.   

    http://blog.csdn.net/oec2003/archive/2008/07/03/2607328.aspx
    http://topic.csdn.net/t/20050124/16/3749952.html
    http://www.cnblogs.com/ynlxc/archive/2008/06/16/303527.html
      

  2.   

    http://hi.baidu.com/lhelp/blog/item/a652e5ccbb1b631300e92832.html
      

  3.   

    安装时选择好排序规则最省事了,如果数据库无法重装,可以使用collate子句,比如select * from person.address where addressline1 collate Chinese_PRC_CI_AI ='7484 Roundtree Drive'
      

  4.   

    如果不能重新安装SQLSERVER,可以使用collate子句,比如:
    select * from person.address where addressline1 collate Chinese_PRC_CI_AI ='7484 Roundtree Drive'
      

  5.   

    声明表变量时指定就可以了,没什么复杂的。 参考:逻辑改为你自己的就可以了。
    CREATE FUNCTION dbo.f_BOMChild(@BOM_NO Varchar(38))
        RETURNS @t TABLE(BOM_NO Varchar(38),PRD_NO Varchar(38) COLLATE Chinese_PRC_CS_AS,LVL INT)
    AS 
    BEGIN
    INSERT @t SELECT 'aa','bb',1
    RETURN 
    END
    GO
    SELECT * FROM dbo.f_BOMChild('xxx')
    GO
      

  6.   

    当然, 不一定把排序规则的指定写在函数内部,也可以是处理时再操作:比如:
    ALTER FUNCTION dbo.f_BOMChild(@BOM_NO Varchar(38))
        RETURNS @t TABLE(BOM_NO Varchar(38),PRD_NO Varchar(38) ,Lvl INT)
    AS 
    BEGIN
    INSERT @t SELECT 'aa','bb',1
    UNION ALL SELECT 'aa','BB',2
    RETURN 
    END
    GO
    SELECT * FROM dbo.f_BOMChild('xxx') WHERE prd_no = 'BB' COLLATE Chinese_PRC_CS_AS
    /*
    aa BB 2
    */
    GO
    对你的问题言,如果你连了表,那么在连接条件中指定相同的排序规则即可:
    DECLARE @t TABLE(a VARCHAR(10) COLLATE Chinese_PRC_CS_AS)
    DECLARE @x TABLE(b VARCHAR(10) COLLATE Chinese_PRC_CI_AS)INSERT @t SELECT 'aa'
    UNION ALL SELECT 'bb'INSERT @x SELECT 'aa'
    UNION ALL SELECT 'BB'
    --直接连表
    --SELECT * FROM @t INNER JOIN @x ON a=b
    /*
    消息 468,级别 16,状态 9,第 10 行
    无法解决 equal to 运算中 "Chinese_PRC_CI_AS" 和 "Chinese_PRC_CS_AS" 之间的排序规则冲突。
    */
    --将a指定为Chinese_PRC_CI_AS,即将a转为为与b相同的规则再连表
    SELECT * FROM @t INNER JOIN @x ON a COLLATE Chinese_PRC_CI_AS=b
    /*
    aa aa
    bb BB
    */--将b指定为Chinese_PRC_CS_AS,即将b转为为与a相同的规则再连表
    SELECT * FROM @t INNER JOIN @x ON a =b COLLATE Chinese_PRC_CS_AS
    /*
    aa aa
    因为CS_AS区分大小写,所以这里只有一条匹配记录
    */--将a,b都转换为第三种排序规则再比较(仅适用于当你不知道a,b各用什么规则时,当然不知道也可以查)
    SELECT * FROM @t INNER JOIN @x ON a COLLATE Chinese_PRC_BIN=b COLLATE Chinese_PRC_BIN
    /*
    aa aa
    a,b都转换为Chinese_PRC_BIN规则。因为PRC_BIN也区分大小写所以只有一条匹配记录
    */
      

  7.   

    COLLATE Chinese_PRC_BIN  也不行...
    后来我改成数据库默认的排序规则 COLLATE   database_default 就行了....