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的表变量时,列加上这个排序规则".可我以前从没用过这个"排序规则",所以请高手告诉我如何弄(我的字段的排序规则,都是 <数据库默认设置>)....急呀,搞了一天还没搞定,都快急死了............谢谢了.......
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的表变量时,列加上这个排序规则".可我以前从没用过这个"排序规则",所以请高手告诉我如何弄(我的字段的排序规则,都是 <数据库默认设置>)....急呀,搞了一天还没搞定,都快急死了............谢谢了.......
解决方案 »
- 怎样在sql中把字符串a,b,c,d用while依次输出a b c d
- 直接查询一个索引视图,但是执行计划显示并没有查询索引视图,查询的还是基础表?
- 现在要将B表中一字段的内容弄到A表中的对应的字段中,请问怎么写SQL?
- 不能创建表,显示错误如下,求救阿
- 服务器上午运行快,下午很慢..
- 很简单的一个数据查询问题呀,在线等待!!!!!!!
- 事务复制问题,报:General network error. Check your network documentation.大家来帮忙呀
- 如何删除表中的某些字段组合重复的纪录,只保留一条?
- 請教一個很奇怪的關於SQL Server跨Server訪問的問題??急急急!!!
- SQL Server7.0的棘手问题——如何实现自动编号
- SQL Server 是否有类似VB中的String函数
- SQL触发器的问题?
http://topic.csdn.net/t/20050124/16/3749952.html
http://www.cnblogs.com/ynlxc/archive/2008/06/16/303527.html
select * from person.address where addressline1 collate Chinese_PRC_CI_AI ='7484 Roundtree Drive'
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
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也区分大小写所以只有一条匹配记录
*/
后来我改成数据库默认的排序规则 COLLATE database_default 就行了....