带参数的sql和不带参数的sql存储过程区别第1/2页
程序员文章站
2024-01-24 10:00:28
带参数的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);
}
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