SQL Server 2005中如何自定义函数,实现类似Min或MAX函数功能。(支持者有分)

wonsoft 2009-03-06 05:31:29
SQL Server 2005中如何自定义一个函数,实现Min或MAX函数功能。

主要实现:
1、在sql语句中直接可以取出值来。从select 的from 子句中传递表名,参数中传递要判断的字段名。即类似于select max(myid) from mytable
2、因为我想做一个通用的ID流水号生成器,而不是专用于某一个表而实现。所以我想到了max和min这两个东东。

请附源码啊,谢谢!

欢迎大家捧场,见者有分,不够再加分 ^_^
...全文
873 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
sndw_1111 2009-03-25
  • 打赏
  • 举报
回复
学习中。看看看
janenone 2009-03-11
  • 打赏
  • 举报
回复
多简单得问题啊,用个子查询什么问题就没有了
sdhdy 2009-03-10
  • 打赏
  • 举报
回复
SQL S005没有 max() 和 min()这两个函数或类似函数么?
sdhdy 2009-03-10
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 wonsoft 的回复:]
非常感谢dawugui和pt1314917的回复,问题是这样的,我想通过以下这种方式追加记录:
Insert into mytable (id,other_cols) select getnextid(id),'值' from mytable

pt1314917 的方法有一个问题:就是每个表都要写一个函数。
dawugui的方法是存储过程需要执行一次命令。
再一次感谢你们。
[/Quote]

真是搞不清楚为什么要这么做?

Insert into mytable (id,other_cols)
这一句:
select getnextid(id),'值' from mytable
用 select max(id)+1,'值' from mytable 不行吗?



Garnett_KG 2009-03-10
  • 打赏
  • 举报
回复

using System;
using System.Text;
using System.Data;
using System.Data.SqlTypes;
using Microsoft.SqlServer;
using Microsoft.SqlServer.Server;

namespace TestFunction
{
[Serializable()]
[SqlUserDefinedAggregate(Format.UserDefined,
IsInvariantToNulls=true,
IsNullIfEmpty=true,
MaxByteSize=8000
)
]
public class CLRMax:IBinarySerialize
{
string currentValue = string.Empty;

public void Read(System.IO.BinaryReader r)
{
currentValue = r.ReadString();
}

public void Write(System.IO.BinaryWriter w)
{
w.Write(currentValue);
}
//Nothing to do
public void Init()
{

}
public void Accumulate(SqlString value)
{
if (value.IsNull)
return;
if (value.Value.CompareTo(currentValue)>0)
currentValue = value.Value;
}
public void Merge(CLRMax other)
{
if (this.currentValue.CompareTo(other.currentValue) > 0)
this.currentValue = other.currentValue;
}
public SqlString Terminate()
{
return new SqlString(currentValue);
}
}
}


编译成Dll後,就可以在sql中使用了。
ex:
编译成CLRMax.dll,放至c:\中。
然後在sql中执行下述语句创建aggregate的function


CREATE ASSEMBLY ClrMax FROM 'C:\ClrMax.dll'
GO
CREATE AGGREGATE ClrMax(@Input NVARCHAR(200)) RETURNS NVARCHAR(MAX)
EXTERNAL NAME [ClrMax].[TestFunction.CLRMax]
GO



开启CLR ENABLED.

exec sp_configure 'show advanced options', '1';
go
reconfigure;
go
exec sp_configure 'clr enabled', '1'
go
reconfigure;
exec sp_configure 'show advanced options', '1';
go



--使用测试.


CREATE TABLE ta (a int,b varchar(10))
GO
CREATE TABLE tb (col1 nvarchar(10),col2 decimal(13,4),col3 datetime,col4 bit)
GO
INSERT INTO ta
SELECT 1,'aa'
UNION ALL
SELECT 2,'aa'
UNION ALL
SELECT 3,'aa'
UNION ALL
SELECT 4,'aa'
UNION ALL
SELECT 10,'bbbbb'
UNION ALL
SELECT 10,'BBBBB'
UNION ALL
SELECT 15,'bbbbZ'

INSERT INTO tb
SELECT 'a',28.4,GETDATE(),0
UNION ALL
SELECT 'b',29.4,GETDATE(),NULL
UNION ALL
SELECT 'c',30.4,DATEADD(DAY,10,GETDATE()),0
GO


SELECT b, dbo.ClrMax(a) FROM ta GROUP BY b
/*
aa 4
bbbbb 10
bbbbZ 15
*/

SELECT dbo.ClrMax(col1),
dbo.ClrMax(col2),
dbo.ClrMax(col3),
dbo.ClrMax(col4)
FROM tb
/*
c 30.4000 03 20 2009 9:41PM 0
*/



Andy__Huang 2009-03-10
  • 打赏
  • 举报
回复
如果你自己写,那还不是用冒泡排序法,执行效率看来比原有的max()和min()速度慢好多;

wwb82954323 2009-03-10
  • 打赏
  • 举报
回复
up
yuyangyangde 2009-03-10
  • 打赏
  • 举报
回复
up
wonsoft 2009-03-10
  • 打赏
  • 举报
回复
再加100分求解

[Quote=引用楼主 wonsoft 的帖子:]
SQL Server 2005中如何自定义一个函数,实现Min或MAX函数功能。

主要实现:
1、在sql语句中直接可以取出值来。从select 的from 子句中传递表名,参数中传递要判断的字段名。即类似于select max(myid) from mytable
2、因为我想做一个通用的ID流水号生成器,而不是专用于某一个表而实现。所以我想到了max和min这两个东东。

请附源码啊,谢谢!

欢迎大家捧场,见者有分,不够再加分 ^_^
[/Quote]


firehand01 2009-03-07
  • 打赏
  • 举报
回复
UP
lingyin55 2009-03-07
  • 打赏
  • 举报
回复
up
htl258_Tony 2009-03-07
  • 打赏
  • 举报
回复
下班了,顶一把.
kye_jufei 2009-03-07
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 dawugui 的回复:]
引用楼主 wonsoft 的帖子:
SQL Server 2005中如何自定义一个函数,实现Min或MAX函数功能。

主要实现:
1、在sql语句中直接可以取出值来。从select 的from 子句中传递表名,参数中传递要判断的字段名。即类似于select max(myid) from mytable
2、因为我想做一个通用的ID流水号生成器,而不是专用于某一个表而实现。所以我想到了max和min这两个东东。

请附源码啊,谢谢!

欢迎大家捧场,见者有分,不够再加分 ^_^ …
[/Quote]

存储过程需要执行一次命令
wonsoft 2009-03-07
  • 打赏
  • 举报
回复
非常感谢dawugui和pt1314917的回复,问题是这样的,我想通过以下这种方式追加记录:
Insert into mytable (id,other_cols) select getnextid(id),'值' from mytable

pt1314917 的方法有一个问题:就是每个表都要写一个函数。
dawugui的方法是存储过程需要执行一次命令。
再一次感谢你们。
dawugui 2009-03-06
  • 打赏
  • 举报
回复
[Quote=引用楼主 wonsoft 的帖子:]
SQL Server 2005中如何自定义一个函数,实现Min或MAX函数功能。

主要实现:
1、在sql语句中直接可以取出值来。从select 的from 子句中传递表名,参数中传递要判断的字段名。即类似于select max(myid) from mytable
2、因为我想做一个通用的ID流水号生成器,而不是专用于某一个表而实现。所以我想到了max和min这两个东东。

请附源码啊,谢谢!

欢迎大家捧场,见者有分,不够再加分 ^_^
[/Quote]
如果是这样,不如在存储过程中用动态SQL完成.

create procedure my_proc 
@tbname varchar(20),
@colname varchar(20)
as
begin
declare @sql as varchar(100)
set @sql = 'select max(' + @colname + ') ' + @colname + ' from ' + @tbname
exec(@sql)
end
go

exec my_proc 'authors' , 'au_id'

drop procedure my_proc

/*
au_id
-----------
998-72-3567

(所影响的行数为 1 行)
*/
pt1314917 2009-03-06
  • 打赏
  • 举报
回复
--下面的代码生成长度为8的编号,编号以BH开头,其余6位为流水号。
--得到新编号的函数
CREATE FUNCTION f_NextBH()
RETURNS char(8)
AS
BEGIN
RETURN(SELECT 'BH'+RIGHT(1000001+ISNULL(RIGHT(MAX(BH),6),0),6) FROM tb WITH(XLOCK,PAGLOCK))
END
GO

--在表中应用函数
CREATE TABLE tb(
BH char(8) PRIMARY KEY DEFAULT dbo.f_NextBH(),
col int)

--插入资料
BEGIN TRAN
INSERT tb(col) VALUES(1)
INSERT tb(col) VALUES(2)
INSERT tb(col) VALUES(3)
DELETE tb WHERE col=3
INSERT tb(col) VALUES(4)
INSERT tb(BH,col) VALUES(dbo.f_NextBH(),14)
COMMIT TRAN

--显示结果
SELECT * FROM tb
/*--结果
BH col
---------------- -----------
BH000001 1
BH000002 2
BH000003 4
BH000004 14
--*/
  • 打赏
  • 举报
回复
up
ljluck7687 2009-03-06
  • 打赏
  • 举报
回复
max和min是sql内置的两个标准函数啊,直接就可以用啊,不用自己写啊
wonsoft 2009-03-06
  • 打赏
  • 举报
回复
[Quote=引用楼主 wonsoft 的帖子:]
SQL Server 2005中如何自定义一个函数,实现Min或MAX函数功能。

主要实现:
1、在sql语句中直接可以取出值来。从select 的from 子句中传递表名,参数中传递要判断的字段名。即类似于select max(myid) from mytable
2、因为我想做一个通用的ID流水号生成器,而不是专用于某一个表而实现。所以我想到了max和min这两个东东。

请附源码啊,谢谢!

欢迎大家捧场,见者有分,不够再加分 ^_^
[/Quote]
程序集处理时,如何操作呢?
wonsoft 2009-03-06
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 shmilywcd 的回复:]
为什么要用函数? 存储过程不可以吗?
存储过程加个返回参数,不就什么都解决了吗?
[/Quote]
首先非常感谢shmilywcd,我是想像函数一样使用,在插入数据时一下就完成了。这样就很干净。而且就算用存储过程,如何传递表名和字段名呢?我还不知如何将字符串转转为字段变量和表名呢。
加载更多回复(4)

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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