MS-SQL SERVER2000 UPDATE语句与自定义函数问题

怪众生太美丽 2011-10-10 06:19:56
弱弱的问句:2000中的update语句中不能使用自定义函数么?INSERT DELETE中也不行?
如下:

--更新
UPDATE #t SET gg=DBO.GetGG(na),
na=REPLACE(na,ISNULL(DBO.GetGG(na),''),'')

--MS-SQL SERVER2008中测试通过,是可以这样用。别人拿代码在2000中报错:

服务器: 消息 208,级别 16,状态 1,行 1
对象名 'DBO.GetGG' 无效。
服务器: 消息 208,级别 16,状态 1,行 1
对象名 'DBO.GetGG' 无效。

要改成以下这样么?以下2008依然是正确的

UPDATE #t SET gg=DBO.GetGG(na),
na=REPLACE(na,ISNULL(DBO.GetGG(na),''),'')
FROM #t


2000的一些规则不熟悉啊..我看书上没提在自定义函数的使用上2005以及以上版本较2000有了较大的更改呀.求解释..
...全文
155 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
怪众生太美丽 2011-10-10
  • 打赏
  • 举报
回复

嗯 谢谢大家..不是代码问题 2000中确实能在UPDATE\INSERT \DELETE中使用自定义函数.运行时搞错了.
中国风 2011-10-10
  • 打赏
  • 举报
回复
SELECT '可口可乐500ml' UNION ALL
SELECT '500ml可口可乐' UNION ALL
SELECT '旺仔QQ糖32g' UNION ALL
SELECT '可比克35g薯片' UNION ALL
SELECT '晨奇中性笔GP-148' UNION ALL
SELECT '114BY文具盒' UNION ALL
SELECT '2.5kg白糖' UNION ALL
SELECT '晨奇148象皮擦'

-------------把结果贴出来看看
中国风 2011-10-10
  • 打赏
  • 举报
回复
'晨奇148象皮擦'--这条用不用取 148
'114BY文具盒' --这条用不用取114BY
--小F-- 2011-10-10
  • 打赏
  • 举报
回复
好久没有用 2000了 没有环境 等测试结果
CalvinR 2011-10-10
  • 打赏
  • 举报
回复
没怎么看懂哦
怪众生太美丽 2011-10-10
  • 打赏
  • 举报
回复
嗯,自定义函数……如下:

CREATE TABLE #t
(
na VARCHAR(20),
gg VARCHAR(10)
);

INSERT INTO #t ( na )
SELECT '可口可乐500ml' UNION ALL
SELECT '500ml可口可乐' UNION ALL
SELECT '旺仔QQ糖32g' UNION ALL
SELECT '可比克35g薯片' UNION ALL
SELECT '晨奇中性笔GP-148' UNION ALL
SELECT '114BY文具盒' UNION ALL
SELECT '2.5kg白糖' UNION ALL
SELECT '晨奇148象皮擦'
GO



-- 根据单位,获取 规格内容
CREATE FUNCTION DBO.GetGGByUnit(@na VARCHAR(20), @u VARCHAR(5))
RETURNS VARCHAR(10)
AS
BEGIN
-- 单位的位置.
DECLARE @idx INT
DECLARE @idx2 INT
-- 返回值.
DECLARE @returnValue VARCHAR(10)
-- 初始化.
SET @returnValue = NULL
-- 取得单位的位置.
SET @idx = CHARINDEX(@u, @na)
IF @idx + LEN(@u) - 1 = LEN(@na)
BEGIN
-- 这个 单位的 位置,是在名称的末尾
-- 需要向前找数字.
SET @returnValue = RIGHT(@na, LEN(@na) - PATINDEX('%[0-9]%', @na) + 1)
END
ELSE
BEGIN
-- 这个 单位的 位置, 不是在名称的末尾, 可能是在开头, 可能在中间
SET @idx2 = PATINDEX('%[0-9]%', @na);
IF @idx2 > @idx
BEGIN
-- 单位 与 数字的 关系
-- 是 先单位 后 数字的。是无效的数据.
SET @returnValue = NULL;
END
ELSE
BEGIN
-- 数字 在 单位 前面.
SET @returnValue = SUBSTRING(@na, @idx2, (@idx - @idx2 + 2) );
END
END
-- 返回.
RETURN @returnValue;
END;
GO





-- 获取 规格内容
CREATE FUNCTION DBO.GetGG(@na VARCHAR(20))
RETURNS VARCHAR(10)
AS
BEGIN
-- 返回值.
DECLARE @returnValue VARCHAR(10)
-- 初始化.
SET @returnValue = NULL
-- 这里根据需要,自行增加各种单位
IF CHARINDEX('ml', @na) > 0
BEGIN
SET @returnValue = DBO.GetGGByUnit(@na, 'ml')
END
ELSE IF CHARINDEX('kg', @na) > 0
BEGIN
SET @returnValue = DBO.GetGGByUnit(@na, 'kg')
END
ELSE IF CHARINDEX('g', @na) > 0
BEGIN
SET @returnValue = DBO.GetGGByUnit(@na, 'g')
END
-- 返回.
RETURN @returnValue
END;
GO


--更新
UPDATE #t SET gg=DBO.GetGG(na),
na=REPLACE(na,ISNULL(DBO.GetGG(na),''),'')
---
--UPDATE #t SET gg=DBO.GetGG(na),
-- na=REPLACE(na,ISNULL(DBO.GetGG(na),''),'')
-- FROM #t
---
SELECT * FROM #t

--删除演示环境
DROP FUNCTION DBO.GetGGByUnit,DBO.GetGG
DROP TABLE #T

MS SQL SERVER2008中OK的,听人家在2000里运行返回说出错,我想确定下2000中是否可以在UPDATE中和INSERT、DELETE语句中使用自定义函数。
[Quote=引用 3 楼 hao1hao2hao3 的回复:]
引用楼主 guoweifyj 的回复:
弱弱的问句:2000中的update语句中不能使用自定义函数么?INSERT DELETE中也不行?
如下:

SQL code


--更新
UPDATE #t SET gg=DBO.GetGG(na),
na=REPLACE(na,ISNULL(DBO.GetGG(na),''),'')


--MS-SQL SERVER2008……
[/Quote]
hao1hao2hao3 2011-10-10
  • 打赏
  • 举报
回复
[Quote=引用楼主 guoweifyj 的回复:]
弱弱的问句:2000中的update语句中不能使用自定义函数么?INSERT DELETE中也不行?
如下:

SQL code


--更新
UPDATE #t SET gg=DBO.GetGG(na),
na=REPLACE(na,ISNULL(DBO.GetGG(na),''),'')


--MS-SQL SERVER2008中测试通过,是……
[/Quote]

这个应该是自定义函数吧?2000的那个数据库服务器中有没有这个自定义函数?
中国风 2011-10-10
  • 打赏
  • 举报
回复
可以使用函數,樓主要確認DB里是否存在這個函數
中国风 2011-10-10
  • 打赏
  • 举报
回复
DBO.GetGG--這個函數在當前環境不存在


select * from sysobjects where Name='GetGG'--查看

34,591

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧