当数值字段处于活动状态时,您可以显示一个名称为“数值表达式求值器”的计算器。要显示该计算器,请按Ctrl+N。
计算器会计算您输入的表达式,并在“结果”字段中显示其结果。单击“粘贴”用计算结果替换字段值。单击“取消”退出“表达式求值器”。
表达式技术描述了您可以输入的表达式。您不能在“表达式求值器”中使用变量,但可以输入常量,例如,pi(圆周率)、e(自然对数底)和 TPS(每秒刻度数)。这些常量是区分大小写的:“表达式求值器”无法识别 PI、E、或 tps。
您也可以输入向量表达式或表达式控制器函数调用,但表达式或函数的结果必须是标量值。否则“表达式求值器”不会执行计算。
输入数字
您可以用相对偏移来更改数值,方法是高亮显示数值字段(不是在“数值表达式求值器”中)的内容并键入 R 或 r,后跟偏移量。
例如,半径”字段显示为 70,并将其高亮显示:
如果您键入 R30,半径会增加 30,值更改为 100。
如果您键入 R-30,半径会减少 30,值更改为 40。
程序不算长,但问题可不少:
1、solve函数的这种调用方式:
solve('lambda-(-2log10(251/Re/sqrt(lambda)+027/l(i)))^(-2) = 0','lambda')是把整个字符串作为参数传递给符号计算内核的,给参数l和Re赋值不起作用,所以在符号计算内核求解时会把l、Re也看成变量,从而导致求解失败。解决的办法是,定义符号变量lambda,然后把方程写成符号表达式从而代入l(i)、Re的值,再调用solve求解。
2、下面的写法
for Re=linspace(410^3,10^7,100)Re作为循环控制变量,每次只取一个值,后面用semilogx绘图时,Re只是一个标量。
3、使用vpa保留一定精度,得到的结果仍然是sym类型,不是数值类型,无法直接用于绘图。绘图时仍需要使用double将其转换成数值类型,这样vpa就显得没有太大必要了,直接调double就可以了。
4、方程中使用的函数log10是通过调用log2实现的,而log2对于sym对象并没有定义,所以,应该把log10()换成log()/log(10)。
5、最后面的gtext不知道楼主想要实现什么效果,目前可以知道的是,tt的定义不正确,因为是把不同长度的字符串拼接成矩阵。如果是想显示图例,那么目前的代码也不可行,因为所有的线条风格都相同。我给改了一下,每个线条用一种随机颜色,然后显示legend。
6、其它还有一些小的细节,比如行尾是否用分号、循环过程中每次绘图之后是否刷新(不刷新则循环过程中无响应,容易被当成死机),请自行体会吧。
附修改后的代码和绘图结果:
clear Lambda Ll=[20 50 100 200 500 1000 2000 5000 10000 20000 50000 100000 inf];
for i=1:length(l)
j=1;
syms lambda
RE=linspace(410^3,10^7,100);
for Re=RE
t=solve(lambda-(-2log(251/Re/sqrt(lambda)+027/l(i))/log(10))^(-2));
Lambda(j)=double(t);
j=j+1;
end
c = rand(1,3);
L{i} = sprintf('d/k = %g', l(i));
semilogx(RE,log10(Lambda),'color',c)
hold on, drawnow
end
xlabel('Reynolds number'),ylabel('log10(\lambda)');
legend(L{:},0)
1、可视化创建
a登录SQL Server
b打开数据库==》要创建存储过程的数据库==》可编程性==》存储过程
c选中“存储过程”右击 ,在系出现的对话框中选择“新建存储过程”
d在右侧出现的对话框中填写具体存储过程内容完成后执行即可
2、代码创建
a全手写代码
一、定义变量--简单赋值
declare @a int
set @a=5
print @a
--使用select语句赋值
declare @user1 nvarchar(50)
select @user1='张三'
print @user1
declare @user2 nvarchar(50)
select @user2 = Name from ST_User where ID=1
print @user2
--使用update语句赋值
declare @user3 nvarchar(50)
update ST_User set @user3 = Name where ID=1
print @user3
二、表、临时表、表变量
--创建临时表1
create table #DU_User1
(
[ID] [int] NOT NULL,
[Oid] [int] NOT NULL,
[Login] [nvarchar](50) NOT NULL,
[Rtx] [nvarchar](4) NOT NULL,
[Name] [nvarchar](5) NOT NULL,
[Password] [nvarchar](max) NULL,
[State] [nvarchar](8) NOT NULL
);
--向临时表1插入一条记录
insert into #DU_User1 (ID,Oid,[Login],Rtx,Name,[Password],State) values (100,2,'LS','0000','临时','321','特殊');
--从ST_User查询数据,填充至新生成的临时表
select into #DU_User2 from ST_User where ID<8
--查询并联合两临时表
select from #DU_User2 where ID<3 union select from #DU_User1
--删除两临时表
drop table #DU_User1
drop table #DU_User2
--创建临时表
CREATE TABLE #t
(
[ID] [int] NOT NULL,
[Oid] [int] NOT NULL,
[Login] [nvarchar](50) NOT NULL,
[Rtx] [nvarchar](4) NOT NULL,
[Name] [nvarchar](5) NOT NULL,
[Password] [nvarchar](max) NULL,
[State] [nvarchar](8) NOT NULL,
)
--将查询结果集(多条数据)插入临时表
insert into #t select from ST_User
--不能这样插入
--select into #t from dboST_User
--添加一列,为int型自增长子段
alter table #t add [myid] int NOT NULL IDENTITY(1,1)
--添加一列,默认填充全球唯一标识
alter table #t add [myid1] uniqueidentifier NOT NULL default(newid())
select from #t
drop table #t
--给查询结果集增加自增长列
--无主键时:
select IDENTITY(int,1,1)as ID, Name,[Login],[Password] into #t from ST_User
select from #t
--有主键时:
select (select SUM(1) from ST_User where ID<= aID) as myID, from ST_User a order by myID
--定义表变量
declare @t table
(
id int not null,
msg nvarchar(50) null
)
insert into @t values(1,'1')
insert into @t values(2,'2')
select from @t
三、循环
--while循环计算1到100的和
declare @a int
declare @sum int
set @a=1
set @sum=0
while @a<=100
begin
set @sum+=@a
set @a+=1
end
print @sum
四、条件语句
--if,else条件分支
if(1+1=2)
begin
print '对'
end
else
begin
print '错'
end
--when then条件分支
declare @today int
declare @week nvarchar(3)
set @today=3
set @week=case
when @today=1 then '星期一'
when @today=2 then '星期二'
when @today=3 then '星期三'
when @today=4 then '星期四'
when @today=5 then '星期五'
when @today=6 then '星期六'
when @today=7 then '星期日'
else '值错误'
end
print @week
五、游标
declare @ID int
declare @Oid int
declare @Login varchar(50)
--定义一个游标
declare user_cur cursor for select ID,Oid,[Login] from ST_User
--打开游标
open user_cur
while @@fetch_status=0
begin
--读取游标
fetch next from user_cur into @ID,@Oid,@Login
print @ID
--print @Login
end
close user_cur
--摧毁游标
deallocate user_cur
六、触发器
触发器中的临时表:
Inserted
存放进行insert和update *** 作后的数据
Deleted
存放进行delete 和update *** 作前的数据
--创建触发器
Create trigger User_OnUpdate
On ST_User
for Update
As
declare @msg nvarchar(50)
--@msg记录修改情况
select @msg = N'姓名从“' + DeletedName + N'”修改为“' + InsertedName + '”' from Inserted,Deleted
--插入日志表
insert into [LOG](MSG)values(@msg)
--删除触发器
drop trigger User_OnUpdate
七、存储过程
--创建带output参数的存储过程
CREATE PROCEDURE PR_Sum
@a int,
@b int,
@sum int output
AS
BEGIN
set @sum=@a+@b
END
--创建Return返回值存储过程
CREATE PROCEDURE PR_Sum2
@a int,
@b int
AS
BEGIN
Return @a+@b
END
--执行存储过程获取output型返回值
declare @mysum int
execute PR_Sum 1,2,@mysum output
print @mysum
--执行存储过程获取Return型返回值
declare @mysum2 int
execute @mysum2= PR_Sum2 1,2
print @mysum2
八、自定义函数
函数的分类:
1)标量值函数
2)表值函数
a:内联表值函数
b:多语句表值函数
3)系统函数
--新建标量值函数
create function FUNC_Sum1
(
@a int,
@b int
)
returns int
as
begin
return @a+@b
end
--新建内联表值函数
create function FUNC_UserTab_1
(
@myId int
)
returns table
as
return (select from ST_User where ID<@myId)
--新建多语句表值函数
create function FUNC_UserTab_2
(
@myId int
)
returns @t table
(
[ID] [int] NOT NULL,
[Oid] [int] NOT NULL,
[Login] [nvarchar](50) NOT NULL,
[Rtx] [nvarchar](4) NOT NULL,
[Name] [nvarchar](5) NOT NULL,
[Password] [nvarchar](max) NULL,
[State] [nvarchar](8) NOT NULL
)
as
begin
insert into @t select from ST_User where ID<@myId
return
end
--调用表值函数
select from dboFUNC_UserTab_1(15)
--调用标量值函数
declare @s int
set @s=dboFUNC_Sum1(100,50)
print @s
--删除标量值函数
drop function FUNC_Sum1
谈谈自定义函数与存储过程的区别:
一、自定义函数:
1 可以返回表变量
2 限制颇多,包括
不能使用output参数;
不能用临时表;
函数内部的 *** 作不能影响到外部环境;
不能通过select返回结果集;
不能update,delete,数据库表;
3 必须return 一个标量值或表变量
自定义函数一般用在复用度高,功能简单单一,争对性强的地方。
二、存储过程
1 不能返回表变量
2 限制少,可以执行对数据库表的 *** 作,可以返回数据集
3 可以return一个标量值,也可以省略return
存储过程一般用在实现复杂的功能,数据 *** 纵方面。
获取存储过程返回值及代码中获取返回值
1OUPUT参数返回值
例: 向Order表插入一条记录,返回其标识
CREATE PROCEDURE [dbo][nb_order_insert](
@o_buyerid int ,
@o_id bigint OUTPUT
)
AS
BEGIN
SET NOCOUNT ON;
BEGIN
INSERT INTO [Order](o_buyerid )
VALUES (@o_buyerid )
SET @o_id = @@IDENTITY
END
END
存储过程中获得方法:
DECLARE @o_buyerid int
DECLARE @o_id bigint
EXEC [nb_order_insert] @o_buyerid ,o_id bigint
2RETURN过程返回值
CREATE PROCEDURE [dbo][nb_order_insert](
@o_buyerid int ,
@o_id bigint OUTPUT
)
AS
BEGIN
SET NOCOUNT ON;
IF(EXISTS(SELECT FROM [Shop] WHERE [s_id] = @o_shopid))
BEGIN
INSERT INTO [Order](o_buyerid )
VALUES (@o_buyerid )
SET @o_id = @@IDENTITY
RETURN 1 — 插入成功返回1
END
ELSE
RETURN 0 — 插入失败返回0
END
存储过程中的获取方法
DECLARE @o_buyerid int
DECLARE @o_id bigint
DECLARE @result bit
EXEC @result = [nb_order_insert] @o_buyerid ,o_id bigint
3SELECT 数据集返回值
CREATE PROCEDURE [dbo][nb_order_select](
@o_id int
)
AS
BEGIN
SET NOCOUNT ON;
SELECT o_id,o_buyerid FROM [Order]
WHERE o_id = @o_id
GO
存储过程中的获取方法
(1)、使用临时表的方法
CREATE TABLE [dbo][Temp](
[o_id] [bigint] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
[o_buyerid] [int] NOT NULL
)
INSERT [Temp] EXEC [nb_order_select] @o_id
– 这时 Temp 就是EXEC执行SELECT 后的结果集
SELECT FROM [Temp]
DROP [Temp] — 删除临时表
(2)、速度不怎么样(不推荐)
SELECT from openrowset(’provider_name','Trusted_Connection=yes’,'exec nb_order_select’)
1获取Return返回值
程序代码
//存储过程
//Create PROCEDURE MYSQL
// @a int,
// @b int
//AS
// return @a + @b
//GO
SqlConnection conn = new SqlConnection(ConfigurationManagerConnectionStrings["LocalSqlServer"]ToString());
connOpen();
SqlCommand MyCommand = new SqlCommand("MYSQL", conn);
MyCommandCommandType = CommandTypeStoredProcedure;
MyCommandParametersAdd(new SqlParameter("@a", SqlDbTypeInt));
MyCommandParameters["@a"]Value = 10;
MyCommandParametersAdd(new SqlParameter("@b", SqlDbTypeInt));
MyCommandParameters["@b"]Value = 20;
MyCommandParametersAdd(new SqlParameter("@return", SqlDbTypeInt));
MyCommandParameters["@return"]Direction = ParameterDirectionReturnValue;
MyCommandExecuteNonQuery();
ResponseWrite(MyCommandParameters["@return"]ValueToString());
2获取Output输出参数值
程序代码
//存储过程
//Create PROCEDURE MYSQL
// @a int,
// @b int,
// @c int output
//AS
// Set @c = @a + @b
//GO
SqlConnection conn = new SqlConnection(ConfigurationManagerConnectionStrings["LocalSqlServer"]ToString());
connOpen();
SqlCommand MyCommand = new SqlCommand("MYSQL", conn);
MyCommandCommandType = CommandTypeStoredProcedure;
MyCommandParametersAdd(new SqlParameter("@a", SqlDbTypeInt));
MyCommandParameters["@a"]Value = 20;
MyCommandParametersAdd(new SqlParameter("@b", SqlDbTypeInt));
MyCommandParameters["@b"]Value = 20;
MyCommandParametersAdd(new SqlParameter("@c", SqlDbTypeInt));
MyCommandParameters["@c"]Direction = ParameterDirectionOutput;
MyCommandExecuteNonQuery();
ResponseWrite(MyCommandParameters["@c"]ValueToString());
C#接收存储过程返回值:
public static int User_Add(User us)
{
int iRet;
SqlConnection conn = new SqlConnection(Conn_Str);
SqlCommand cmd = new SqlCommand("User_Add", conn);
cmdCommandType = CommandTypeStoredProcedure;
cmdParametersAddWithValue("@UName", usUName);
cmdParametersAddWithValue("@UPass", usUPass);
cmdParametersAddWithValue("@PassQuestion", usPassQuestion);
cmdParametersAddWithValue("@PassKey", usPassKey);
cmdParametersAddWithValue("@Email", usEmail);
cmdParametersAddWithValue("@RName", usRName);
cmdParametersAddWithValue("@Area", usArea);
cmdParametersAddWithValue("@Address", usAddress);
cmdParametersAddWithValue("@ZipCodes", usZipCodes);
cmdParametersAddWithValue("@Phone", usPhone);
cmdParametersAddWithValue("@QQ", usQQ);
cmdParametersAdd("@RETURN_VALUE", "")Direction = ParameterDirectionReturnValue;
try
{
connOpen();
cmdExecuteNonQuery();
iRet = (int)cmdParameters["@RETURN_VALUE"]Value;
}
catch (SqlException ex)
{
throw ex;
}
finally
{
connClose();
}
return iRet;
}
C#接收存储过程输出参数:
public static decimal Cart_UserAmount(int UID)
{
decimal iRet;
SqlConnection conn = new SqlConnection(Conn_Str);
SqlCommand cmd = new SqlCommand("Cart_UserAmount", conn);
cmdCommandType = CommandTypeStoredProcedure;
cmdParametersAddWithValue("@UID", UID);
cmdParametersAdd("@Amount", SqlDbTypeDecimal)Direction=ParameterDirectionOutput;
try
{
connOpen();
cmdExecuteNonQuery();
iRet = (decimal)cmdParameters["@Amount"]Value;
}
catch (SqlException ex)
{
throw ex;
}
finally
{
connClose();
}
return iRet;
}
//////////////////////////////////////////////////////////////
SQL 2000用户自定义函数 一。SQL Server 的三种自定义函数
“自定义函数”是我们平常的说法,而“用户定义的函数”是 SQL Server 中书面的说法。
SQL Server 2000 允许用户创建自定义函数,自定义函数可以有返回值。
自定义函数分为:标量值函数或表值函数
•如果 RETURNS 子句指定一种标量数据类型,则函数为标量值函数。可以使用多条 Transact-SQL 语句定义标量值函数。
•如果 RETURNS 子句指定 TABLE,则函数为表值函数。
表值函数又可分为:内嵌表值函数(行内函数)或多语句函数
•如果 RETURNS 子句指定的 TABLE 不附带列的列表,则该函数为内嵌表值函数。
•如果 RETURNS 子句指定的 TABLE 类型带有列及其数据类型,则该函数是多语句表值函数。
标量值函数示例
CREATE FUNCTION dboFoo()
RETURNS int
AS
BEGIN
declare @n int
select @n=3
return @n
END
create function GetSex(@sex int)
returns varchar(2)-- 用nvarchar(1)
as -- nvarchar:不管是一个字符还是一个汉字,都存为2个字节
begin -- varchar:汉字是2个字节,其他字符存为1个字节
declare @ssex varchar(2)-- 用nvarchar(1)
if(@sex=1)
set @ssex='男'
else
set @ssex='女'
return (@ssex)
end
调用:
select id,username,dboGetSex(Sex) as sex ,loginnum from t_user
内嵌表值函数示例
CREATE FUNCTION dboFoo()
RETURNS TABLE
AS
return select id, title from msgs
内嵌表值函数只有一个 select 语句。
多语句表值函数示例(部分)
CREATE FUNCTION FindUsers (@userid int )
RETURNS @FindUser TABLE (id int primary key, UserName varchar(30), RegDateTime DateTime,LoginNum int)
as
begin
insert into @FindUser Select ID, UserName,RegDateTime,LoginNum From T_User Where ID=@userid
return
end
调用:
SELECT FROM FindUsers(6)
注意其 RETURNS 部分。
多语句函数的主体中允许使用以下语句。未在下面的列表中列出的语句不能用在函数主体中。
•赋值语句。
•控制流语句。
•DECLARE 语句,该语句定义函数局部的数据变量和游标。
•SELECT 语句,该语句包含带有表达式的选择列表,其中的表达式将值赋予函数的局部变量。
•游标 *** 作,该 *** 作引用在函数中声明、打开、关闭和释放的局部游标。只允许使用以 INTO 子句向局部变量赋值的 FETCH 语句;不允许使用将数据返回到客户端的 FETCH 语句。
•INSERT、UPDATE 和 DELETE 语句,这些语句修改函数的局部 table 变量。
•EXECUTE 语句调用扩展存储过程。
二如何调用自定义函数
调用自定义函数(用户定义的函数)和调用内置函数方式基本相同,
•当调用标量值函数时,必须加上“所有者”,通常是 dbo(但不是绝对,可以在企业管理器中的“用户定义的函数”中查看所有者)。
•当调用表值函数时,可以只使用函数名称。
示例
SELECT
select dboSta(cnt) from tbl
示例
SELECT
FROM fn_MyTableFunc( 12309, N'O''Neill' )
三。存储过程和自定义函数的区别
存储过程(用户定义的存储过程)和自定义函数(用户定义的函数)的区别,在网上已经有讨论过,但有些显得过于零散,有些又篇幅过长不能保证每个人都细心阅读。这里作一个归纳,当然只是应用层面的,可能不全面。
•存储过程,功能强大,可以执行包括修改表等一系列数据库 *** 作,也可以创建为 SQL Server 启动时自动运行的存储过程。
•自定义函数,用户定义函数不能用于执行一组修改全局数据库状态的 *** 作。
•存储过程,可以使用非确定函数。
•自定义函数,不允许在用户定义函数主体中内置非确定函数。
•存储过程,可返回记录集。
•自定义函数,可以返回表变量。
•存储过程,其返回值不能被直接引用。
•自定义函数,其返回值可以被直接引用。
•存储过程,用 EXECUTE 语句执行。
•自定义函数,在查询语句中调用。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)