医院信息科HIS数据库管理员sqlserver常用命令语句一览

文章目录

这里整理了医院信息常用的sql命令

查询sql中数据不为空并且不为null

SELECT * FROM 表名 WHERE 字段名 IS NOT NULL AND 字段名 <> ”;

sql 井号的含义?

SQL可以使用一个 # 创建本地临时表,两个# 创建全局临时表
例:
CREATE TABLE #temp_table_local ( id INT, value VARCHAR(10) )
CREATE TABLE ##temp_table_global (id INT,value VARCHAR(10))
临时表在会话中创建,会话结束的时候,数据库自动删除临时表
对于 本地临时表 (#开头的) 其他会话无法访问数据与表结构
对于 全局临时表 (##开头的) 其他会话可以访问数据与表结构,SQL Server会在会话结束以后,自动删除临时表。

Drop Table语句

有时候我们会决定我们需要从数据库中清除一个表格。事实上,如果我们不能这样做的话,那将会是一个很大的问题,因为数据库管理师 (Database Administrator — DBA) 势必无法对数据库做有效率的管理。还好,SQL 有提供一个 DROP TABLE 的语法来让我们清除表格。 DROP TABLE 的语法是:

DROP TABLE "表格名";

我们如果要清除在SQL CREATE 中建立的顾客表格,我们就打入:

DROP TABLE Customer;

 

SQL Server 中本地(局部)临时表

一个SSMS查询窗口就是一个会话

通过本地临时表验证:

本地临时表仅在当前会话中可见;全局临时表在所有会话中都可见。
本地临时表的名称前面有一个编号符 (#table_name),而全局临时表的名称前面有两个编号符 (##table_name)。

打开一个查询窗口,新建本地临时表,插入数据,并查询

create table #temptable (id int identity(1,1) primary key,
                    name nvarchar(10) null);
go
insert into #temptable(name) values('mark'),
                              ('test');
go
select * from #temptable

医院信息科HIS数据库管理员sqlserver常用命令语句一览-1

再“新建查询”窗口,

select * from #temptable

医院信息科HIS数据库管理员sqlserver常用命令语句一览-2

这是为什么呢?

这两个SSMS查询窗口是两个会话?

sp_who查看下,用事实说话:

医院信息科HIS数据库管理员sqlserver常用命令语句一览-3

52,53那列是SPID,我没有截完整。

SPID即为会话ID,会话ID不同,那即是两个会话了呀!

医院信息科HIS数据库管理员sqlserver常用命令语句一览-4

Sqlserver数据库中的临时表详解

临时表在Sqlserver数据库中,是非常重要的,下面就详细介绍SQL数据库中临时表的特点及其使用,仅供参考。

 

临时表与永久表相似,但临时表存储在tempdb中,当不再使用时会自动删除。临时表有两种类型:本地和全局。它们在名称、可见性以及可用性上有区别。

对于临时表有如下几个特点:

  • 本地临时表就是用户在创建表的时候添加了“#”前缀的表,其特点是根据数据库连接独立。只有创建本地临时表的数据库连接有表的访问权限,其它连接不能访问该表;
  • 不同的数据库连接中,创建的本地临时表虽然“名字”相同,但是这些表之间相互并不存在任何关系;在SQLSERVER中,通过特别的命名机制保证本地临时表在数据库连接上的独立性。
  • 真正的临时表利用了数据库临时表空间,由数据库系统自动进行维护,因此节省了表空间。并且由于临时表空间一般利用虚拟内存,大大减少了硬盘的I/O次数,因此也提高了系统效率。
  • 临时表在事务完毕或会话完毕数据自动清空,不必记得用完后删除数据。

 

本地临时表

本地临时表的名称以单个数字符号 (#) 打头;它们仅对当前的用户连接(也就是创建本地临时表的connection)是可见的;当用户从 SQL Server 实例断开连接时被删除。

 

例如我们在一个数据库连接中用如下语句创建本地临时表#Temp

数据库连接1:

CREATE TABLE #Temp ( id int, customer_name nvarchar(50), age int )

然后同时启动数据库连接2,执行查询#Temp的操作
数据库连接2:

select * from #Temp

我们来看看数据库连接2的结果是什么?
数据库连接2:

医院信息科HIS数据库管理员sqlserver常用命令语句一览-1

结果显示,数据库连接2找不到表#Temp。这说明#Temp这张临时表,只是对创建它的数据库连接1可见,而对于数据库连接2来说是不可见的。

 

全局临时表

全局临时表的名称以两个数字符号 (##) 打头,创建后对任何数据库连接都是可见的,当所有引用该表的数据库连接从 SQL Server 断开时被删除。

例如我们在一个数据库连接中用如下语句创建全局临时表##Temp,然后插入三行数据

数据库连接1:

CREATE TABLE ##Temp ( id int, customer_name nvarchar(50), age int ) INSERT INTO ##Temp VALUES(1,’老王’,20),(2,’老张’,30),(3,’老李’,25)

接着我们在数据库连接2中,查询##Temp的数据
数据库连接2:

select * from ##Temp

数据库连接2结果如下
数据库连接2:

医院信息科HIS数据库管理员sqlserver常用命令语句一览-1

可以看到,数据库连接2可以成功访问到数据库连接1创建的全局临时表##Temp,但是如果我们现在关闭数据连接1,然后再执行数据库连接2的##Temp查询语句会发生什么呢?结果如下:

关闭数据库连接1,然后数据库连接2再次执行:

select * from ##Temp

医院信息科HIS数据库管理员sqlserver常用命令语句一览-1

我们发现关闭数据库连接1后,数据库连接2就找不到全局临时表##Temp了。这是因为数据库连接1被关闭后,数据库连接2此时也没有语句正在使用临时表##Temp,所以Sqlserver认为此时已经没有数据库连接在引用全局临时表##Temp了,就将##Temp释放掉了。

 

接下来,我们尝试在数据库连接2中对全局临时表##Temp持有事务中的排他锁(X锁)后,然后关闭数据库连接1.

数据库连接1:

CREATE TABLE ##Temp ( id int, customer_name nvarchar(50), age int ) INSERT INTO ##Temp VALUES(1,’老王’,20),(2,’老张’,30),(3,’老李’,25)

数据库连接2:

BEGIN TRAN select * from ##Temp with(xlock)

关闭数据库连接1,然后数据库连接2执行:

select * from ##Temp

医院信息科HIS数据库管理员sqlserver常用命令语句一览-1

结果显示我们尽管关闭了数据库连接1,但是由于数据库连接2在事务中一直持有全局临时表##Temp的排他锁(X锁),所以临时表##Temp并没有随着数据库连接1的关闭而被释放掉,只要数据库连接2中启动的事务没有被回滚或提交,那么数据库连接2会一直持有临时表##Temp的排他锁,这时Sqlserver会认为还有数据库连接正在引用全局临时表##Temp,所以##Temp不会被释放掉。

原文链接:,转发请注明来源落伍老站长!

发表评论