帶參數(shù)的sql和不帶參數(shù)的sql存儲過程區(qū)別第1/2頁
更新時間:2008年09月03日 00:27:14 作者:
來執(zhí)行我們sql語句,看到很多分頁存儲過程都是直接拼湊sql語句然后用exec('')執(zhí)行起來了,這個從效率和安全上面來說,都是不推薦的。
帶參數(shù)的sql語句,在數(shù)據(jù)庫端,執(zhí)行的是
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'測試實(shí)體模型', @Model_Desp = N'實(shí)體模型描述', @Model_IsSys = 0
沒有帶值的sql語句。其執(zhí)行是直接的sql語句。
insert into lcs_Sys_Model ([Model_GUID],[Model_Name],[Model_Desp],[Model_IsSys]) values ( 'F3CD1369-58C0-4A1F-AF88-05FCF734E079','name','desp',1 )
看上面的執(zhí)行代碼,你會不會認(rèn)為是下面的高效?。空f實(shí)話我也沒有仔細(xì)測試過。可是據(jù)我所知,sqlserver能夠緩存參數(shù)信息和sql編譯后的信息,第一句帶參 數(shù)的sql因為前面一部是不變的(紅色部分)。所以能夠緩存起來(就像執(zhí)行存儲過程一樣)。而下面的一句sql。因為value后面的值總是不固定,因此 sqlserver總是認(rèn)為是不同的sql語句。因此每次都要重新編譯生成。
以上結(jié)論來源于下面的測試代碼。
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 = "測試實(shí)體模型";
parameters[2].Value = "實(shí)體模型描述";
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'測試實(shí)體模型', @Model_Desp = N'實(shí)體模型描述', @Model_IsSys = 0
沒有帶值的sql語句。其執(zhí)行是直接的sql語句。
insert into lcs_Sys_Model ([Model_GUID],[Model_Name],[Model_Desp],[Model_IsSys]) values ( 'F3CD1369-58C0-4A1F-AF88-05FCF734E079','name','desp',1 )
看上面的執(zhí)行代碼,你會不會認(rèn)為是下面的高效?。空f實(shí)話我也沒有仔細(xì)測試過。可是據(jù)我所知,sqlserver能夠緩存參數(shù)信息和sql編譯后的信息,第一句帶參 數(shù)的sql因為前面一部是不變的(紅色部分)。所以能夠緩存起來(就像執(zhí)行存儲過程一樣)。而下面的一句sql。因為value后面的值總是不固定,因此 sqlserver總是認(rèn)為是不同的sql語句。因此每次都要重新編譯生成。
以上結(jié)論來源于下面的測試代碼。
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 = "測試實(shí)體模型";
parameters[2].Value = "實(shí)體模型描述";
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);
}
相關(guān)文章
DBeaver執(zhí)行外部sql文件詳細(xì)圖文教程
DBeaver最近才使用,以前使用的PL/SQL,有些不是很熟悉,記錄下來,下面這篇文章主要給大家介紹了關(guān)于DBeaver執(zhí)行外部sql文件的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-06-06Select data from an Excel sheet in MSSQL
Select data from an Excel sheet in MSSQL...2007-06-06DataGrip 數(shù)據(jù)導(dǎo)出與導(dǎo)入的實(shí)現(xiàn)示例
DataGrip 是一款類似于Workbench的數(shù)據(jù)庫設(shè)計工具。文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09sql2005可實(shí)時監(jiān)測數(shù)據(jù)庫版本控制SQL的觸發(fā)器
用于sql2005實(shí)時監(jiān)測數(shù)據(jù)庫版本控制SQL的觸發(fā)器2008-10-10dapper使用Insert或update時部分字段不映射到數(shù)據(jù)庫
我們在使用dapper的insert或update方法時可能會遇見一些實(shí)體中存在的字段但是,數(shù)據(jù)庫中不存在的字段,這樣在使用insert時就是拋出異常提示字段不存在,這個時候該怎么解決呢,下面給大家分享示例實(shí)體代碼,感興趣的朋友一起看看吧2023-12-12未在本地計算機(jī)上注冊“Microsoft.Jet.OleDb.4.0”提供程序錯誤的解決方法
未在本地計算機(jī)上注冊“Microsoft.Jet.OleDb.4.0”提供程序錯誤的解決方法,需要的朋友可以參考下。2011-08-08