sql server基础(SQL Server 连接基础知识)

本文目录
SQL Server 连接基础知识
引言
该堆栈的顶部是 API 或对象库层 应用程序通过对象库公开的 API 函数或接口连接到 Microsoft? SQL Server 用于访问 SQL Server 的 API 示例包括 ODBC 和 DB Library 用于访问 SQL Server 的对象库示例包括 OLE DB ADO 和 ADO NET 由于 ADO 最终使用 OLE DB 与服务器通信 因此 Windows 应用程序在与 SQL Server 通信时实际上只使用两个常用的对象库 即 OLE DB 和 ADO NET 由于通过 ADO 或 ADO NET 进行连接通常比通过 ODBC 进行连接更普遍(但 SQL Server 的查询分析器和企业管理器仍通过 ODBC 进行连接) 因此本文将从 ADO/OLE DB 和 ADO NET 的角度介绍 SQL Server 连接体系结构的客户端 如今 大多数应用程序均通过对象库(而非 ODBC 或类似 API)连接到 SQL Server
ADO 和 OLE DB
OLE DB 客户端(也称作使用者)通过客户端提供程序与服务器以及其他后端程序进行通信 此提供程序是一组 组件(一个或多个) 用于将应用程序请求转换为网络进程间通信 (IPC) 请求 在使用 SQL Server 的情况下 最常用的 OLE DB 提供程序是 SQLOLEDB 它是 Microsoft 为 SQL Server 提供的 OLE DB 提供程序 SQLOLEDB 随附于 SQL Server 中 并作为 Microsoft 数据访问组件 (MDAC) 库的一部分安装
为了使用 ADO 与 SQL Server 进行通信 应用程序首先使用 Connection 对象建立与服务器的连接 ADO 的 Connection 对象接受一个连接字符串 该字符串指定要使用的 OLE DB 提供程序以及传递给它的参数 如果应用程序使用 SQLOLEDB 提供程序连接到 SQL Server 则该字符串中将显示 SQLOLEDB
ADO 应用程序还可以通过 ODBC 连接到 SQL Server 为此 应用程序将使用适用于 ODBC 的 OLE DB 提供程序 并指定在其连接字符串中引用目标 SQL Server 的 ODBC 数据源 这种情况下 应用程序与 OLE DB 进行通信 同时 ODBC 的 OLE DB 提供程序调用相应的 ODBC API 以便与 SQL Server 进行会话
ADO NET
ADO NET 应用程序通常使用 NET Framework Data Provider for SQL Server 连接到 SQL Server 该本机提供程序使 ADO NET 对象能够与 SQL Server 直接进行通信 通常 应用程序使用 SqlConnection 对象建立连接 然后使用 SqlCommand 对象向服务器发送命令 并接收服务器返回的结果 SqlDataAdapter 和 SqlDataReader 类通常与 SqlCommand 一起使用 以便通过托管的代码应用程序与 SQL Server 进行交互
通过 OleDbConnection 类 ADO NET 应用程序还可以使用 SQLOLEDB OLE DB 提供程序与 SQL Server 进行交互 此外 它们可以通过 OdbcConnection 类使用 ODBC 访问 SQL Server 因此 仅通过托管代码 您就有三种不同的方法从应用程序访问 SQL Server 从故障排除的角度而言 了解这些方法是非常有用的 因为它可以帮助您将遇到的与连接相关的问题归结到特定的数据访问层或库
客户端 Net Library
该堆栈中的下一层是 Net Library Net Library 在 API 或对象库(应用程序使用它与 SQL Server 进行通信)与网络协议(用于与网络交换数据)之间提供了一个通道 SQL Server 为所有主要的网络协议提供了 Net Library 这些库以透明方式将客户端发出的请求发送到 SQL Server 并将服务器发出的响应返回给客户端 可以使用 SQL Server 的客户端网络实用程序配置适用于特定客户端的 Net Library 支持的客户端协议包括 TCP/IP 命名管道 NWLink 多协议 (RPC) 和其他一些协议
尤其值得一提的 Net Library 是共享内存 Net Library 顾名思义 该 Net Library 使用 Windows 的共享内存功能在 SQL Server 客户端与服务器之间进行通信 显然 这意味着客户端与服务器必须位于同一台物理计算机上
由于它能够绕过物理网络堆栈 因此共享内存 Net Library 要比其他 Net Library 快得多 对共享内存区域的访问受到同步对象的保护 因此客户端与服务器之间的通信速度主要受限于 Windows 对内核对象进行调度的能力 以及进程与共享内存区域之间进行数据复制的能力
可以在连接时将某个时间段或(本地)指定为您的计算机名 来指示使用共享内存 Net Library 也可以在连接时为计算机\实例名加上前缀 lpc: 来指示要使用共享内存 Net Library
注意 即使连接到同一台计算机上的 SQL Server 共享内存 Net Library 也未必就是最佳的连接选项 在某些情况下 客户端与服务器之间的直接连接可能限制它的扩展性 与应用程序整体体系结构中的其他元素一样 应始终对给定技术解决方案进行全面的测试 然后才能判断它是否有良好的扩展性以及是否比其他方法更快
连接
客户端进行连接时 SQL Server 的用户模式计划程序 (UMS) 组件将它指定给特定的计划程序 启动时 SQL Server 为系统上的每个 CPU 创建一个单独的 UMS 计划程序 当客户端连接到服务器时 这些客户端将指定给具有最少连接数的计划程序 连接后 客户端将不会更换计划程序 它将始终受到指定计划程序的控制 直到连接断开
这对与服务器建立多个连接的应用程序很重要 如果应用程序性能较差 或无法在它的多个连接上平均分配工作 则在该应用程序的某些连接之间可能造成不必要的 CPU 资源争用 而其他连接实际上却处于空闲状态
例如 应用程序与双处理器计算机上运行的 SQL Server 建立了四个连接 连接 和 隶属于处理器 连接 和 隶属于处理器 如果应用程序的大部分工作通过连接 和 执行 则这两个连接将争用 CPU 而 CPU 实际上可能仍处于空闲状态 这种情况下 应用程序只能断开某些连接或重新连接某些连接 并希望连接 和 隶属于不同的 CPU (连接时无法指定处理器隶属关系) 或在它的连接上重新分配工作负荷 以便每个连接的工作负荷更加均衡 当然 后一种情况要远好于前一种情况
连接内存
SQL Server 为客户端请求的每个连接保留三个数据包缓冲区 每个缓冲区的大小取决于 sp_configure 存储过程指定的默认网络数据包大小 如果默认网络数据包大小小于 KB 则这些数据包的内存将由 SQL Server 的缓冲池提供 否则 该内存将由 SQL Server 的 MemToLeave 区域分配
值得一提的是 NET Framework Data Provider for SQL Server 的默认网络数据包大小为 KB 因此 与托管代码客户端连接关联的缓冲区通常由 SQL Server 的 MemToLeave 区域提供 而典型的 ADO 应用程序却不同 它们的默认数据包大小为 KB 因此缓冲区将由 SQL Server 缓冲池分配
事件
连接后的客户端请求通常分为两种广泛类别 语言事件和远程过程调用 尽管还存在其他类别 但大多数由 SQL Server 客户端发送到服务器的请求由以下两种类型之一构成 语言事件是从客户端发送到服务器的 一组 T SQL 例如 如果调用 ADO Command 对象(其 CommandText 属性设置为 T SQL 查询 CommandType 属性设置为 adCmdText)的 Execute 方法 则查询将作为语言事件提交给服务器 同样 如果将 CommandType 设置为 adCmdTable 并调用 Execute 方法 则 ADO 将生成一个内部查询(它将选择 CommandText 属性标识的表中的所有列) 并将它作为语言事件提交给服务器 另一方面 如果将 CommandType 设置为 adStoredProc 则调用 Execute 将使 ADO 向服务器提交一个远程过程调用请求 以执行 CommandText 属性中列出的存储过程
为何要关心将请求作为语言事件还是作为 RPC 提交给服务器呢?通常 这是因为 RPC 的功能更为出色 特别是在重复调用具有不同筛选值的同一查询时 尽管 SQL Server 可以自动将普通的语言事件请求参数化 但这种能力非常有限 它从不尝试自动将某些类型的查询参数化 这可能会导致基本相同的查询产生不同的执行 从而只因为这些不同的执行提供不同的值 而导致在服务器上白白浪费计划编译的成本 这通常不是您所希望的结果 您希望针对查询的第一次执行编译一个新的计划 然后将该计划重复用于具有不同参数的执行
而 RPC 则通过显式参数化查询(而不是依赖服务器参数化查询)来支持计划重复使用 为过程的第一次执行生成一个计划后 随后的执行将自动重复使用该计划 即使它们提供的参数值不同 与通过语言事件调用存储过程相比 使用 RPC 调用存储过程不仅节省了计划编译所需的执行时间和 CPU 资源 还增强了 SQL Server 内存资源的利用率 因为它避免了冗余执行计划所浪费的内存
在执行动态 T SQL 时 通常首选 sp_executesql 而不是 EXEC() 也出于同样的原因 Sp_executesql 的工作方式是 使用指定的查询创建一个存储过程 然后使用提供的参数调用它 与 EXEC() 不同 sp_executesql 提供了一个允许您参数化动态 T SQL 并支持计划重复使用的机制 使用 sp_executesql 执行的动态查询比使用 EXEC() 的查询能够在更大程度上避免不必要的编译和资源消耗
TDS
从客户端发送到 SQL Server 的 RPC 语言事件和其他类型的请求被格式化为称作表格数据流 (TDS) 的 SQL Server 特定数据格式 TDS 是 SQL Server 客户端和服务器之间使用的 语言 对于它的确切格式将不作介绍 但是 如果客户端要与 SQL Server 进行通信 就必须使用 TDS
目前 SQL Server 支持三种版本的 TDS TDS (适用于 SQL 客户端) TDS (适用于 SQL Server 客户端)和 TDS (适用于 SQL Server 和 客户端) 完全支持所有 SQL Server 功能的版本只有 TDS 其他版本保持向后兼容
服务器端 Net Library
关于数据库的,SQL SEVERE
SQL语句基础
一、基础
1、说明:创建数据库
Create DATABASE database-name
2、说明:删除数据库
drop database dbname
3、说明:备份sql server
— 创建 备份数据的 device
USE master
EXEC sp_addumpdevice ‘disk’, ‘testBack’, ‘c:\mssql7backup\MyNwind_1.dat’
— 开始 备份
BACKUP DATABASE pubs TO testBack
4、说明:创建新表
create table tabname(col1 type1 ,..)
根据已有的表创建新表:
A:create table tab_new like tab_old (使用旧表创建新表)
B:create table tab_new as select col1,col2… from tab_old definition only
5、说明:删除新表
drop table tabname
6、说明:增加一个列
Alter table tabname add column col type
注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。
7、说明:添加主键: Alter table tabname add primary key(col)
说明:删除主键: Alter table tabname drop primary key(col)
8、说明:创建索引:create index idxname on tabname(col….)
删除索引:drop index idxname
注:索引是不可更改的,想更改必须删除重新建。
9、说明:创建视图:create view viewname as select statement
删除视图:drop view viewname
10、说明:几个简单的基本的sql语句
选择:select * from table1 where 范围
插入:insert into table1(field1,field2) values(value1,value2)
删除:delete from table1 where 范围
更新:update table1 set field1=value1 where 范围
查找:select * from table1 where field1 like ’%value1%’ —like的语法很精妙,查资料!
排序:select * from table1 order by field1,field2
总数:select count as totalcount from table1
求和:select sum(field1) as sumvalue from table1
平均:select avg(field1) as avgvalue from table1
最大:select max(field1) as maxvalue from table1
最小:select min(field1) as minvalue from table1
11、说明:几个高级查询运算词
A: UNION 运算符
UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。
B: EXCEPT 运算符
EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。
C: INTERSECT 运算符
INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。
注:使用运算词的几个查询结果行必须是一致的。
12、说明:使用外连接
A、left outer join:
左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。
SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
B:right outer join:
右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。
C:full outer join:
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。
SQL server中,存储过程基础和表达式怎么写,然后约束怎么理解
什么是存储过程呢?
存储过程就是作为可执行对象存放在数据库中的一个或多个SQL命令。
通俗来讲:存储过程其实就是能完成一定操作的一组SQL语句。
那为什么要用存储过程呢?
1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
2.当对数据库进行复杂操作时,可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。
3.存储过程可以重复使用,可减少数据库开发人员的工作量。
4.安全性高,可设定只有某些用户才具有对指定存储过程的使用权
那存储过程怎么用呢?
以下通过表Student 来了解存储过程,因为是要了解存储过程的简单用法,所以所有例子均很简单。
无参数存储过程:
选出Student表中的所有信息,
create proc StuProc
as //此处 as 不可以省略不写
begin //begin 和 end 是一对,不可以只写其中一个,但可以都不写
select S#,Sname,Sage,Ssex from student
end
go
有参数存储过程:
全局变量
全局变量也称为外部变量,是在函数的外部定义的,它的作用域为从变量定义处开始,到本程序文件的末尾。
选出指定姓名的学生信息:
create proc StuProc
@sname varchar(100)
as
begin
select S#,Sname,Sage,Ssex from student where sname=@sname
end
go
exec StuProc ’赵雷’ //执行语句
上面是在外部给变量赋值,也可以在内部直接给变量设置默认值
create proc StuProc
@sname varchar(100)=’赵雷’
as
begin
select S#,Sname,Sage,Ssex from student where sname=@sname
end
go
exec StuProc
也可以把变量的内容输出,使用output
create proc StuProc
@sname varchar(100),
@IsRight int output //传出参数
as
if exists (select S#,Sname,Sage,Ssex from student where sname=@sname)
set @IsRight =1
else
set @IsRight=0
go
declare @IsRight int
exec StuProc ’赵雷’ , @IsRight output
select @IsRight
以上是全局变量,下面来了解局部变量
局部变量也称为内部变量。局部变量是在函数内作定义说明的。其作用域仅限于函数内部,离开该函数后再使用这种变量是非法的。
局部变量的定义:必须先用Declare命令定以后才可以使用,declare{@变量名 数据类型}
局部变量的赋值方法:set{@变量名=表达式}或者select{@变量名=表达式}
局部变量的显示:select @变量名
create proc StuProc
as
declare @sname varchar(100)
set @sname=’赵雷’
select S#,Sname,Sage,Ssex from student where sname=@sname
go
exec StuProc
那如果是要把局部变量的数据显示出来怎么办呢?
create proc StuProc
as
declare @sname varchar(100)
set @sname=(select Sname from student where S#=01)
select @sname
go
exec StuProc

更多文章:
he agreed to help(用need to do sth.和agree to do sth. 造句)
2026年8月31日 01:00
instr函数的返回值(关于vb中InStr函数的一个小问题)
2026年1月26日 22:30
slcp是什么意思(matlab.*和matlab. s有什么区别)
2026年1月3日 12:00
db2数据库update后想恢复(你好,SQL修改错了,修改前没有备份,请问怎么还原到修改前的数据,你知道吗可以给联系方式我请教一下)
2026年9月17日 12:00
assert python用法(python:assert_raises() 怎么用啊,有哪些参数 请说得详细些,先谢谢了!)
2026年7月11日 08:30
this is it歌词好诡异(Turn The Lights On的歌词翻译)
2025年7月26日 02:30
tabletennis安卓游戏(table tennis touch多人游戏时提示game center断开链接怎么解决)
2025年8月8日 17:15
迷你qq头像(2021头像可爱呆萌男生,寻找一些头像小男孩的那种)
2026年2月14日 13:00












