带参数的sql和不带参数的sql区别。

带参数的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语句。因此每次都要重新编译生成。

 

 



以上结论来源于下面的测试代码。
http://space.cnblogs.com/question/2692/

            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);
            }


            cmd.Connection.Open();
            cmd.ExecuteNonQuery();
            //第一次执行结束
            cmd.Parameters.Clear();
            cmd.CommandText = "SELECT SCOPE_IDENTITY()";

            //System.Diagnostics.Debug.Assert(cmd.ExecuteScalar()==null);

            Console.WriteLine(cmd.ExecuteScalar().ToString());
            //第二次执行结束
            cmd.Connection.Close();

            Console.WriteLine("第一次测试结束");
            Console.Read();

            cmd.CommandText = "insert into lcs_Sys_Model ([Model_GUID],[Model_Name],[Model_Desp],[Model_IsSys]) values ( 'F3CD1369-58C0-4A1F-AF88-05FCF734E079','name','desp',1 )";
            cmd.Connection.Open();
            cmd.ExecuteNonQuery();
           
            cmd.CommandText = "SELECT SCOPE_IDENTITY()";
            Console.WriteLine(cmd.ExecuteScalar().ToString());
            cmd.Connection.Close();
            Console.WriteLine("第二次测试结束");
            Console.Read();


本来想用参数化的sql插入一条记录再取回自增的值的。发现数据库端是这个执行方式。那就没戏啦。。。只能改变sql语句。把自增放到sql的最后去取啦。。

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

SELECT SCOPE_IDENTITY()

在查询分析器里面最后确认运行一下。。。这二个是不同的范围的,是取不到值的。。

 

 

 

最后提配一点,为了性能和安全,我们在写存储过程的时候也要使用

exec sp_executesql  '带参数的sql语句','参数定义语句,多个参数用,号分隔',参数赋值1,参数赋值2,参数赋值3```

来执行我们sql语句,看到很多分页存储过程都是直接拼凑sql语句然后用exec('')执行起来了,这个从效率和安全上面来说,都是不推荐的。

 

 这个貌似是我第一个上首页的文章。有不对的地方,还请大家指教。

posted on   lcs-帅  阅读(2587)  评论(7编辑  收藏  举报

编辑推荐:
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)

导航

< 2008年9月 >
31 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 1 2 3 4
5 6 7 8 9 10 11

统计

点击右上角即可分享
微信分享提示