Sql server 实用技巧总结

摘要:
无法在Enterprise Manager或SqlServerManagementStudio中修改Id字段,如图所示:解决方案:SETIDENTITY_INSERTBingot1ONINSERTINTOBINGOT1VALUESSETIDENTY_INERTBingot1关闭-用完后,请确保关闭执行。您查看的数据如下:从LogDate开始,您可以看到Id=1的数据最后插入。要保留标识计数器,请使用DELETE。TRUNCATETABLE删除表中的所有行,而不记录单行删除操作。TRUNCATETABLE在功能上与没有WHERE子句的DELETE语句相同;然而,TRUNCATETABLE更快,使用更少的系统资源和事务日志资源——查看表的所有列信息。SELECT*FROMSysColumnsWHERidINSys.types存储物理存储类型。
一、 从主键说起
CREATETABLE BingoT1
(
id INTIDENTITY(1, 1),
NAMENVARCHAR(10),--姓名
IdentityNo VARCHAR(18),--身份证号码
LogDate DATETIMEDEFAULT(GETDATE()),--录入日期
PRIMARYKEY( id )--主键约束
)
Go
INSERTINTO BingoT1(NAME, identityNo )
VALUES('李斌','123456789012345')
INSERTINTO BingoT1(NAME, identityNo )
VALUES('张霖青','123456789012345678')
INSERTINTO BingoT1(NAME, identityNo )
VALUES('李菲','12345678901234500x')
INSERTINTO BingoT1(NAME, identityNo )
VALUES('戈晓娟','123456789012345')
Go
SELECT*FROM BingoT1
Go
我们创建示例表BingoT1并插入若干条数据,主键是一个自增字段。

问题一:误删了一条记录如何修复?
在企业管理器(sql 2000)或Sql Server Management Studio中无法修改Id字段,如图:

Sql server 实用技巧总结第1张

解决办法:
SETIDENTITY_INSERT bingot1 ON
INSERTINTO BingoT1(id,NAME, identityNo )
VALUES( 1,'李斌','123456789012345')
SETIDENTITY_INSERT bingot1 OFF--用完一定要关闭

执行后查看数据如下:

Sql server 实用技巧总结第2张

从LogDate的时间上可以看出Id=1的数据是最后插入的。
问题二:Delete掉所有的数据后,为什么Id不从1 开始?
DELETEFROM bingot1
Go
INSERTINTO BingoT1(NAME, identityNo )
VALUES('李斌','123456789012345')
INSERTINTO BingoT1(NAME, identityNo )
VALUES('张霖青','123456789012345678')
INSERTINTO BingoT1(NAME, identityNo )
VALUES('李菲','12345678901234500x')
INSERTINTO BingoT1(NAME, identityNo )
VALUES('戈晓娟','123456789012345')
Go
SELECT*FROM BingoT1

Go
执行后查看数据如下:

解决办法:
TRUNCATETABLE BingoT1
GO
如果表包含标识列,该列的计数器重置为该列定义的种子值。如果未定义种子,则使用默认值 1。若要保留标识计数器,请使用 DELETE。
TRUNCATE TABLE删除表中的所有行,而不记录单个行删除操作。TRUNCATE TABLE 在功能上与没有 WHERE 子句的 DELETE 语句相同;但是,TRUNCATE TABLE 速度更快,使用的系统资源和事务日志资源更少。

二、 SQL SERVER 的中枢神经--系统表
Ø SysObjects
存储数据库中创建的每个对象(例如约束、默认值、日志、规则以及存储过程)。
SELECT*FROM sysobjects WHERE xtype='U'
SELECT*FROM SysObjects WHERE xtype='D'
SELECT*FROM SysObjects WHERE xtype='PK'
执行后可以看到我们新创建的表BingoT1、表的默认约束DF__BingoT1__LogDate__07020F21(以DF开头)、表的主键PK__BingoT1__060DEAE8(以PK开头)。
Xtype标识对象类型。可以是下列对象类型中的一种:
C = CHECK 约束 D = 默认设置或 DEFAULT 约束
F = FOREIGN KEY 约束 L = 日志 FN = 标量函数 IF = 内联表函数
P = 存储过程 PK = PRIMARY KEY 约束(类型为 K) RF = 复制筛选器存储过程
S = 系统表 TF = 表函数 TR = 触发器 U = 用户表 UQ = UNIQUE 约束(类型为 K)
V = 视图 X = 扩展存储过程
可以通过下面的语句查看和表相关的各种资源:
--查看和表相关的各种资源
SELECT*
FROMsysobjects
WHEREparent_obj IN(SELECT id
FROM sysobjects
WHEREname='BingoT1')
Ø SysColumns
存储表和视图中的列,并保存数据库中的存储过程的每个参数。可以使用如下语句查看表BINGOT1的所有列信息。
--查看表的所有列信息
SELECT*
FROMSysColumns
WHEREid IN(SELECT id
FROM sysobjects

WHEREname='BingoT1')

Sql server 实用技巧总结第3张

Ø Sys.types

存放物理存储类型。内容如下所示:SELECT*FROMsys.types

Sql server 实用技巧总结第4张

问题:系统表我很少用,有什么实际应用吗?
下面我们就用这3个系统表来写一个简单的代码生成器!
应用一,生成实体类属性:
SELECT'public virtual '
CASE t.name WHEN'int'THEN'int'ELSE'string'END' ' c.name ' { get; set; }'
FROMdbo.sysobjects AS o
INNERJOIN dbo.syscolumns AS c ON c.id = o.id
INNERJOIN dbo.systypes AS t ON c.xusertype = t.xusertype
WHEREo.type ='U'
AND o.name ='BingoT1'
输出结果如下:
public virtual int id{ get; set; }
public virtual string NAME{ get; set; }
public virtual string IdentityNo{ get; set; }
public virtual string LogDate{ get; set; }
应用二,生成列表页面和添加页面:
首先需要给每个字段添加一个扩展属性,其中参数@value赋值备注、@level1name赋值表名、@level2name赋值字段名。
EXECsys.sp_addextendedproperty @name=N'MS_Description',
@value=N'主键', @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'BingoT1', @level2type=N'COLUMN',@level2name=N'id'
EXECsys.sp_addextendedproperty @name=N'MS_Description',
@value=N'姓名', @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'BingoT1', @level2type=N'COLUMN',@level2name=N'NAME'
EXECsys.sp_addextendedproperty @name=N'MS_Description',
@value=N'身份证号码', @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'BingoT1', @level2type=N'COLUMN',@level2name=N'IdentityNo'
EXECsys.sp_addextendedproperty @name=N'MS_Description',
@value=N'录入日期', @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'BingoT1', @level2type=N'COLUMN',@level2name=N'LogDate'
然后就可以使用系统函数生成列表页面代码.
SELECT'<asp:BoundColumn DataField="' objname '" HeaderText="'
CAST(valueASNVARCHAR)'"'
CASECAST(valueASNVARCHAR)
WHEN'主键'THEN' Visible="False"'
ELSE''END'></asp:BoundColumn> '
FROMFN_LISTEXTENDEDPROPERTY(NULL,'user','dbo','table','BingoT1',
'column',DEFAULT)
结果如下(在查询分析器中以文本格式显示结果,快捷键Ctrl T):
<asp:BoundColumn DataField="id" HeaderText="主键" Visible="False">
</asp:BoundColumn>
<asp:BoundColumn DataField="NAME" HeaderText="姓名">
</asp:BoundColumn>
<asp:BoundColumn DataField="IdentityNo" HeaderText="身份证号">
</asp:BoundColumn>
<asp:BoundColumn DataField="LogDate" HeaderText="录入日期">
</asp:BoundColumn>
再生成添加页面代码,其中Char(13)代表回车符.
SELECT'<tr>'CHAR(13)
' <td style=" 30%;">'CAST(VALUEASNVARCHAR)'</td>'CHAR(13)
' <td style=" 70%;">'
'<asp:TextBox ID="txt' objname '" runat="server" style="220px"></asp:TextBox> <td>'CHAR(13)
'<tr> '
FROMFN_LISTEXTENDEDPROPERTY(NULL,'user','dbo','table','BingoT1',
'column',DEFAULT)
结果如下(在查询分析器中以文本格式显示结果,快捷键Ctrl T):
<tr>
<td style=" 30%;">主键:</td>
<td style=" 70%;"><asp:TextBox runat="server" style="220px"></asp:TextBox> <td>
<tr>
<tr>
<td style=" 30%;">姓名:</td>
<td style=" 70%;"><asp:TextBox runat="server" style="220px"></asp:TextBox> <td>
<tr>
<tr>
<td style=" 30%;">身份证号码:</td>
<td style=" 70%;"><asp:TextBox runat="server" style="220px"></asp:TextBox> <td>
<tr>
<tr>
<td style=" 30%;">录入日期:</td>
<td style=" 70%;"><asp:TextBox runat="server" style="220px"></asp:TextBox> <td>
<tr>

页面效果图如下所示:

Sql server 实用技巧总结第5张

免责声明:文章转载自《Sql server 实用技巧总结》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇一个人工智能项目里的中文分词方案rownum与rowId下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

oracle事务和锁

数据库事务概括 1. 说明   一组SQL,一个逻辑工作单位,执行时整体修改或者整体回退。 2.事务相关概念   1)事务的提交和回滚:COMMIT/ROLLBACK   2)事务的开始和结束     开始事务:连接到数据库,执行DML、DCL、DDL语句     结束事务: 1. 执行DDL(例如CREATE TABLE),DCL(例如GRANT),系统...

Oracle怎么更改用户名

  Oracle怎么更改用户名2012-10-22   很多人都以为oracle可以很容易的改密码,但不能改用户名字.实际上名字也可以改的.只不过改起来有点麻烦.   改用户名的用处 至于改名字的用处嘛,在这样一种情景下非常有用.假如某个公司给每个员工一个账户,用户名就是你的英文名.当某个员工arwen要离职了,那就要删除掉用户arwen了.但是我们知道...

Oracle中对列加密的方法

Oracle中对列加密的方法 2011-12-22 17:21:13 分类: Linux Oracle支持多种列加密方式: 1,透明数据加密(TDE):create table encrypt_col(id int,txt varchar2(100) encrypt using '算法名称' identified by '密钥' no salt);优...

snowflake 分布式唯一ID生成器

本文来自我的github pages博客http://galengao.github.io/ 即www.gaohuirong.cn 摘要: 原文参考运维生存和开源中国上的代码整理 我的环境是python3.5,pip8.2的 一、python版本 前言 由于考虑到以后要动态切分数据,防止将不同表切分数据到同一个表中时出现主键相等的冲突情况,这里我们使用...

Oracle架构实现原理、含五大进程解析(图文详解)

目录 目录 前言 Oracle RDBMS架构图 内存结构 系统全局区SGA 高速缓存缓冲区数据库缓冲区 日志缓冲区 共享池 其他结构 进程结构 用户连接进程 用户进程User Process Server Process服务进程 程序全局区PGA Oracle的connect连接和session会话与User Process紧密相关...

Spring Boot整合Mybatis配置详解

首先,你得有个Spring Boot项目。 平时开发常用的repository包在mybatis里被替换成了mapper。 配置: 1.引入依赖: <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-s...