3dmax数值表达式求值器脚本

3dmax数值表达式求值器脚本,第1张

  当数值字段处于活动状态时,您可以显示一个名称为“数值表达式求值器”的计算器。要显示该计算器,请按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 L

l=[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 语句执行。

•自定义函数,在查询语句中调用。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/12185402.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存