sqlserver 参数化查询 允许为null_关于SQL Server的insert执行的秘密(上)一个最简单的insert分析...

准备工作:

我需要一张User表,这张表有几个字段,还有一个自增长的数字id,表结构如下:

49395dfc8d72a0a7c937577ed8cee90c.png

这是一张比现实应用中简单的多的用户表,UserID是自增长字段。

开始执行一个最简单的INSERT:

INSERT INTO [DB_BJ].[dbo].[User]           ([UserName]           ,[Email]           ,[Signature]           ,[CreateTime]           ,[IP])     VALUES           ('yukaizhao'           ,'yukaizhao@abc.com'           ,'My Blog is http://www.cnblogs.com/yukaizhao/'           ,'2010-06-01'           ,'127.0.0.1')

我们在sql server管理器中,选中工具栏中的显示执行计划的图标(下图),并执行语句: 

1aa02b00f5d898ef0450d145936100a3.png

其执行计划如下所示: 

6cfc5f7afa9ad96f148c7829a234642c.png

查询计划显示sql server执行的sql并非我们写的原始sql,sql server先智能的将我们的sql语句转换为一个参数化的sql,如下:

INSERT INTO [DB_BJ].[dbo].[User]([UserName],[Email],[Signature],[CreateTime],[IP]) values(@1,@2,@3,@4,@5)

SQL Server做了这步转换之后就可以让使用不同参数的sql可以使用同一个经过预编译的sql语句。

我们从执行计划的各个步骤看一下这个insert的执行过程,注意看SQL Server的执行计划要从右往左看.

1. 常量扫描做的工作是根据用户输入的sql中的常量生成一个行

MSDN的原话如下:

The Constant Scan operator introduces one or more constant rows into a query. A Compute Scalar operator is often used after a Constant Scan to add columns to a row produced by the Constant Scan operator

上面的话是MSDN上的解释,常量扫描会引入一个或者多个常量行到一个查询中;通常情况下紧跟常量扫描的是计算标量运算符,计算标量运算符会为常量扫描运算符产生的行添加列。

2. 计算标量,在这一步生成了自增id的值,请看下图,这一步输出了一个表达式Expr1003,为什么这个输出值是自增id,请看第4步中的图

ab7cc30c533fbeb4fc2f86d91626a4b2.png

3. 第二个计算标量,将原始sql中的常量值赋给5个变量

4. 聚集索引插入,执行插入操作,将数据加入到数据表中,请看下图:

ba9d128b58683b2212b61562e85797d2.png

图中的第一个红框是给UserName赋值的表达式,[DB_BJ].[dbo].[User].[UserName] = RaiseIfNull([Expr1004]) ,这个谓词中的[DB_BJ]是我的测试数据库名字,RaiseIfNull应该是sql server自动添加的函数,用来在参数值为NULL的时候抛出异常,但是这个函数是不允许用户调用的。

图中的第二个红框是给UserID赋值的,把生成的自增id赋值给UserID,[DB_BJ].[dbo].[User].[UserID] = [Expr1003] ,这里可以印证我们在第2步中的推断。

5. 最后一步是insert,这一步将输入的sql语句的执行计划存储起来以便复用。

这就是一个最简单的INSERT语句的分析^_^

文章转载自:

http://www.cnblogs.com/yukaizhao/archive/2010/07/02/sql-server-insert-secret.html

文章经作者授权转载,版权归原文作者所有

图片来源于网络,侵权必删!

c39fc6e9e78cacd5dcb06436577318ae.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值