欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

带参数的sql和不带参数的sql存储过程区别第1/2页

程序员文章站 2022-05-17 08:49:01
带参数的sql语句,在数据库端,执行的是 exec sp_executesql eg: exec sp_executesql n'insert into lcs_sys_m...
带参数的sql语句,在数据库端,执行的是
exec sp_executesql
eg:

exec sp_executesql n'insert into lcs_sys_model ([model_guid],[model_name],[model_desp],[model_issys]) values ( @model_guid,@model_name,@model_desp,@model_issys)', n'@model_guid uniqueidentifier,@model_name nvarchar(50),@model_desp nvarchar(500),@model_issys bit', @model_guid = 'f3cd1369-58c0-4a1f-af88-05fcf734e079', @model_name = n'测试实体模型', @model_desp = n'实体模型描述', @model_issys = 0


没有带值的sql语句。其执行是直接的sql语句。
insert into lcs_sys_model ([model_guid],[model_name],[model_desp],[model_issys]) values ( 'f3cd1369-58c0-4a1f-af88-05fcf734e079','name','desp',1 )


看上面的执行代码,你会不会认为是下面的高效啊?说实话我也没有仔细测试过。可是据我所知,sqlserver能够缓存参数信息和sql编译后的信息,第一句带参 数的sql因为前面一部是不变的(红色部分)。所以能够缓存起来(就像执行存储过程一样)。而下面的一句sql。因为value后面的值总是不固定,因此 sqlserver总是认为是不同的sql语句。因此每次都要重新编译生成。

以上结论来源于下面的测试代码。

system.data.sqlclient.sqlparameter[] parameters = {
new sqlparameter("@model_guid", sqldbtype.uniqueidentifier),
new sqlparameter("@model_name", sqldbtype.nvarchar,50),
new sqlparameter("@model_desp", sqldbtype.nvarchar,500),
new sqlparameter("@model_issys", sqldbtype.bit)
};
parameters[0].value = new guid("f3cd1369-58c0-4a1f-af88-05fcf734e079");
parameters[1].value = "测试实体模型";
parameters[2].value = "实体模型描述";
parameters[3].value = false;



string connstr = @"integrated security=sspi;persist security info=false;initial catalog=officially;data source=lcsnb"sql2k";
string cmdstr = "insert into lcs_sys_model ([model_guid],[model_name],[model_desp],[model_issys]) values ( @model_guid,@model_name,@model_desp,@model_issys)";

system.data.sqlclient.sqlconnection conn = new system.data.sqlclient.sqlconnection(connstr);
system.data.sqlclient.sqlcommand cmd = new system.data.sqlclient.sqlcommand(cmdstr);

cmd.connection = conn;
foreach (var item in parameters)
{
cmd.parameters.add(item);
}

1