重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
Sql Server自定义聚合函数详细步骤
成都创新互联是专业的田家庵网站建设公司,田家庵接单;提供网站建设、成都网站制作,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行田家庵网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!
开始-
输出-
首先用VS2008/VS2005建立一个SQL Server项目,右键解决方案添加新项
点击“确定”按钮后,SQL Server项目会要求连接一个数据库,我们可以选择一个数据库
然后在工程中加入一个聚合类(joinstr.cs),如图
joinstr.cs中的最终代码如下:
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Text;
[Serializable]
[SqlUserDefinedAggregate(
Format.UserDefined, //use custom serialization to serialize the intermediate result
IsInvariantToNulls = true, //optimizer property
IsInvariantToDuplicates = false, //optimizer property
IsInvariantToOrder = false, //optimizer property
MaxByteSize = 8000), //maximum size in bytes of persisted value
]
public struct JoinStr:IBinarySerialize
{
private StringBuilder sbIntermediate;
public void Init()
{
sbIntermediate = new StringBuilder();
}
public void Accumulate(SqlString Value)
{
if (Value == null || Value.ToString().ToLower().Equals("null"))
{
return;
}
else
{
sbIntermediate.Append(Value);
}
}
public void Merge(JionStr Group)
{
sbIntermediate.Append(Group.sbIntermediate);
}
public SqlString Terminate()
{
return new SqlString(sbIntermediate.ToString());
}
// This is a place-holder member field
#region IBinarySerialize Members
public void Read(System.IO.BinaryReader r)
{
sbIntermediate = new StringBuilder(r.ReadString());
}
public void Write(System.IO.BinaryWriter w)
{
w.Write(this.sbIntermediate.ToString());
}
#endregion
}
在编写完上述代码后,可以使用Visual Studio来部署(右向工程,在弹出菜单上选“部署”即可)。
在执行上面的SQL语句之前,需要将SQL Server2005的clr功能打开
现在可以使用joinstr来聚合字符串了。
select [t_code_role].[role_mc] as '角色',dbo.JoinStr([t_code_right].[right_mc]+',') as '权限' from [t_data_roleright],[t_code_right],[t_code_role] where [t_data_roleright].[role_bm]=[t_code_role].[role_bm] and [t_data_roleright].[right_bm]=[t_code_right].[right_bm] group by [t_code_role].[role_mc]
部署成功后,可调用并执行用户定义的函数。注意
在默认情况下,Microsoft
SQL
Server
中关闭了
公共语言运行库
(CLR)
集成功能。必须启用该功能才能使用
SQL
Server
项目项。若要启用
CLR
集成,请使用
sp_configure
存储过程
的“启用
clr”选项。有关更多信息,请参见启用
CLR
集成。注意显示的对话框和菜单命令可能会与帮助中的描述不同,具体取决于您现用的设置或版本。若要更改设置,请在“工具”菜单上选择“导入和导出设置”。有关更多信息,请参见
Visual
Studio
设置。
创建用户定义的
SQL
Server
函数
使用Visual
Studio
建立和部署此函数
C++
示例在编译时必须使用
/clr:safe
编译器
选项。
对于Visual
Basic
和
Visual
C#,在“解决方案
资源管理器
”中,打开“TestScripts”文件夹,然后双击“Test.sql”文件,以打开它进行编辑。添加执行您的
用户定义函数
的代码。请参见下面的第二个示例。对于Visual
C++,在“解决方案资源管理器”中双击“debug.sql”文件,以打开它进行编辑。添加执行您的用户定义函数的代码。请参见下面的第二个示例。将用户定义函数部署到
SQL
Server。有关更多信息,请参见如何:将
SQL
Server
项目项部署到
SQL
Server
中。按F5
通过在
SQL
Server
上执行用户定义的函数来对其进行调试。下面的代码示例创建用户定义的将价格作为参数的
标量函数
addTax,添加
销售税
并返回价格和销售税的加和。创建该函数后,将其部署到
SQL
Server。有关更多信息,请参见如何:将
SQL
Server
项目项部署到
SQL
Server
中Visual
Basic
复制代码
Imports
System.Data.SqlTypes
Imports
Microsoft.
SqlServer
.ServerPartial
Public
Class
UserDefinedFunctions
Public
Const
SALES_TAX
As
Double
=
0.086
_
Public
Shared
Function
addTax(ByVal
originalAmount
As
SqlDouble)
As
SqlDouble
Dim
taxAmount
As
SqlDouble
=
originalAmount
*
SALES_TAX
Return
originalAmount
+
taxAmount
End
FunctionEnd
ClassC#
复制代码
using
System.Data.SqlTypes;
using
Microsoft.SqlServer.Server;public
partial
class
UserDefinedFunctions{public
const
double
SALES_TAX
=
.086;
[SqlFunction()]
public
static
SqlDouble
addTax(SqlDouble
originalAmount){SqlDouble
taxAmount
=
originalAmount
*
SALES_TAX;
return
originalAmount
+
taxAmount;}}C++
复制代码
#include
"stdafx.h"#using
#using
#using
using
namespace
System;
using
namespace
System::Data;
using
namespace
System::Data::Sql;
using
namespace
System::Data::SqlTypes;
using
namespace
Microsoft::SqlServer::Server;//
In
order
to
debug
your
Aggregate,
add
the
following
to
your
debug.sql
SELECT
dbo.addTax(10)
//public
ref
class
UserDefinedFunctions{public:static
initonly
double
SALES_TAX
=
0.086;
[SqlFunction()]
static
SqlDouble
AddTax(SqlDouble
originalAmount){SqlDouble
taxAmount
=
originalAmount
*
SALES_TAX;
return
originalAmount
+
taxAmount;}};向您的项目中
TestScripts
文件夹中的
Test.sql(在
Visual
C++
中为
debug.sql)文件,添加用于测试用户定义函数的代码。例如,若要测试此函数,请使用查询,如“SELECT
dbo.addTax(10)”。您应见到返回的值“10.86”。
复制代码
存储过程可以 你就建存储过程呗
你这个 报错很明显 函数 不让你这么干
在函数内对带副作用的运算符 'SELECT INTO' 的使用无效。
你换个招试试
比如 select count(*)=@v_count as dd from khn_configgroup where config_id=@template_id and group_id=@group_id;
sqlsever函数变量如何赋值我也不是很清楚 没用过
或者用 set let
create function f_factorial (@t int)
returns int
as
begin
declare @i int,@total int
set @i=1
set @total=1
while @i=@t
begin
set @total=@total*@i
set @i=@i+1
end
return @total
end
调用
select dbo.f_factorial(10)
SELECT (表名+getdate()+cast(rand() * (1000) AS int)) as value from t_table
sqlserver 应该有一个timestamp类型 那个是秒后面6位。。。 用那个其实就可以了
创建自定义函数:
use 数据库名
go
create function 函数名
(@pno int)
returns int
as
begin
declare @a int
if not exists(select * from person where pno=@pno)
set @a=-1
else
set @a=1
return @a
end
调用函数:
use 数据库名
go
select dbo.函数名(13250)