SqlServer基本语法,备份还原+实例(有借鉴意义)
得到数据库路径 select?????*???from???sysfiles? 1、说明:创建数据库 一、指定逻辑备份设备 根据已有的表创建新表:?A:create?table?tab_new?like?tab_old?(使用旧表创建新表) 13、对数据库进行操作: ? 二、提升 1、说明:复制表(只复制结构,源表名:a?新表名:b)?(Access可用) 3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径)?(Access可用) 4、说明:子查询(表名1:a?表名2:b) 5、说明:显示文章、提交人和最后回复时间 6、说明:外连接查询(表名1:a?表名2:b) 7、说明:在线视图查询(表名1:a?) 8、说明:between的用法,between限制查询数据范围时包括了边界值,not?between不包括 10、说明:两张关联表,删除主表中已经在副表中没有的信息? 11、说明:四表联查问题: 12、说明:日程安排提前五分钟提醒? 13、说明:一条sql?语句搞定数据库分页 ??declare?@start?int,@end?int? ??@sql??nvarchar(600) ??set?@sql=’select?top’+str(@end-@start+1)++from?T?where?rid?not?in(select?top(@str-1)+Rid?from?T?where?Rid>-1)’ ??exec?sp_executesql?@sql 注意:在top后不能直接跟一个变量,所以在实际应用中只有这样的进行特殊的处理。Rid为一个标识列,如果top后还有具体的字段,这样做是非常有好处的。因为这样可以避免?top的字段如果是逻辑索引的,查询的结果后实际表中的不一致(逻辑索引中的数据有可能和数据表中的不一致,而查询时如果处在索引则首先查询索引) 14、说明:前10条记录 15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.) 16、说明:包括所有在?TableA?中但不在?TableB和TableC?中的行并消除所有重复行而派生出一个结果表 17、说明:随机取出10条数据 18、说明:随机选择记录 19、说明:删除重复记录 alter?table?tablename--添加一个自增列add??column_b?int?identity(1,1)?delete?from??where?column_b?not?in(select?max(column_b)??from??group?by?column1,column2...)?drop?column?column_b 20、说明:列出数据库里所有的表名 21、说明:列出表里的所有的列名 22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select?中的case。 23、说明:初始化表table1 TRUNCATE?TABLE?table1 24、说明:选择从10到15的记录 三、技巧 1、1=1,1=2的使用,在SQL语句组合时用的较多 “where?1=1”?是表示选择全部????“where?1=2”全部不选,如:if?@strWhere?!=''?beginset?@strSQL?=?'select?count(*)?as?Total?from?['?+?@tblName?+?']?where?'?+?@strWhere?endelse?set?@strSQL?=?'select?count(*)?as?Total?from?['?+?@tblName?+?']'?end? 我们可以直接写成 错误!未找到目录项。 3、压缩数据库 4、转移数据库给新用户以已存在用户权限 5、检查备份集 6、修复数据库 7、日志清除 USE?tablename?--?要操作的数据库名SELECT?@LogicalFileName?=?'tablename_log',?--?日志文件名@MaxMinutes?=?10,?--?Limit?on?time?allowed?to?wrap?log.?@NewSize?=?1?--?你想设定的日志文件的大小(M) Setup?/?initializeDECLARE?@OriginalSize?intSELECT?@OriginalSize?=?size??FROM?sysfiles?WHERE?name?=?@LogicalFileNameSELECT?'Original?Size?of?'?+?db_name()?+?'?LOG?is?'?+??CONVERT(VARCHAR(30),@OriginalSize)?+?'?8K?pages?or?'?+?CREATE?TABLE?DummyTrans?(DummyColumn?char?(8000)?not?null) DECLARE?@Counter????INT,0); font-size:12pt">?@StartTime?DATETIME,0); font-size:12pt">?@TruncLog???VARCHAR(255)SELECT?@StartTime?=?GETDATE(),0); font-size:12pt">?@TruncLog?=?'BACKUP?LOG?'?+?db_name()?+?'?WITH?TRUNCATE_ONLY' DBCC?SHRINKFILE?(@LogicalFileName,?@NewSize)EXEC?(@TruncLog)--?Wrap?the?log?if?necessary.WHILE?@MaxMinutes?>?DATEDIFF?(mi,?@StartTime,?GETDATE())?--?time?has?not?expired?AND?@OriginalSize?=?(SELECT?size?FROM?sysfiles?WHERE?name?=?@LogicalFileName)???AND?(@OriginalSize?*?8?/1024)?>?@NewSize???BEGIN?--?Outer?loop.SELECT?@Counter?=?0?WHILE???((@Counter?<?@OriginalSize?/?16)?AND?(@Counter?<?50000))?BEGIN?--?update?INSERT?DummyTrans?VALUES?('Fill?Log')?DELETE?DummyTrans?SELECT?@Counter?=?@Counter?+?1?END?EXEC?(@TruncLog)??SELECT?'Final?Size?of?'?+?db_name()?+?'?LOG?is?'?+?FROM?sysfiles?DROP?TABLE?DummyTransSET?NOCOUNT?OFF? 8、说明:更改某个表 9、存储更改全部表 CREATE?PROCEDURE?dbo.User_ChangeObjectOwnerBatch@OldOwner?as?NVARCHAR(128),0); font-size:12pt">@NewOwner?as?NVARCHAR(128)AS DECLARE?@Name????as?NVARCHAR(128)DECLARE?@Owner???as?NVARCHAR(128)DECLARE?@OwnerName???as?NVARCHAR(128) DECLARE?curObject?CURSOR?FOR?select?'Name'????=?name,0); font-size:12pt">???'Owner'????=?user_name(uid)from?sysobjectswhere?user_name(uid)=@OldOwnerorder?by?name OPEN???curObjectFETCH?NEXT?FROM?curObject?INTO?@Name,?@OwnerWHILE(@@FETCH_STATUS=0)BEGIN?????if?@Owner=@OldOwner?begin???set?@OwnerName?=?@OldOwner?+?'.'?+?rtrim(@Name)???exec?sp_changeobjectowner?@OwnerName,?@NewOwnerend--?select?@name,@NewOwner,@OldOwner END close?curObjectdeallocate?curObjectGO
Name?????score Zhangshan?80 Lishi???????59 Wangwu??????50 Songquan?69 while((select?min(score)?from?tb_table)<60) begin update?tb_table?set?score?=score*1.01? where?score<60 if??(select?min(score)?from?tb_table)>60 ??break ?else ????continue end 数据开发-经典 1.按姓氏笔画排序:Select?*?From?TableName?Order?By?CustomerName?Collate?Chinese_PRC_Stroke_ci_as?//从少到多 2.数据库加密: 4.查看硬盘分区: 5.比较A,B表是否相等: 6.杀掉所有的事件探察器进程: 7.记录搜索: ?select?top?10?recid?from?A?where?recid?not??in(select?top?30?recid?from?A) 分析:如果这样写会产生某些问题,如果recid在表中存在逻辑索引。 select?top?10?recid?from?A?where……是从索引中查找,而后面的select?top?30?recid?from?A则在数据表中查找,这样由于索引中的顺序有可能和数据表中的不一致,这样就导致查询到的不是本来的欲得到的数据。 解决方案 1,?用order?by?select?top?30?recid?from?A?order?by?ricid?如果该字段不是自增长,就会出现问题 2,?在那个子查询中也加条件:select?top?30?recid?from?A?where?recid>-1 例2:查询表中的最后以条记录,并不知道这个表共有多少数据,以及表结构。 print?@s??????exec??sp_executesql??@s 9:获取当前数据库中的所有用户表select?Name?from?sysobjects?where?xtype='u'?and?status>=0 10:获取某一个表的所有字段 ?where?id?in?(select?id?from?sysobjects?where?type?=?'u'?and?name?=?'表名') 两种方式的效果相同 11:查看与某一个表相关的视图、存储过程、函数 12:查看当前数据库中所有存储过程 13:查询用户创建的所有数据库select?*?from?master..sysdatabases?D?where?sid?not?in(select?sid?from?master..syslogins?where?name='sa')或者select?dbid,?name?AS?DB_NAME?from?master..sysdatabases?where?sid?<>?0x01 14:查询某一个表的字段和数据类型 15:不同服务器数据库之间的数据操作 --创建链接服务器? exec?sp_addlinkedserver???'ITSV?',?'?',?'SQLOLEDB?',?'远程服务器名或ip地址?'? exec?sp_addlinkedsrvlogin??'ITSV?',?'false?',null,?'用户名?',?'密码?'? --查询示例? select?*?from?ITSV.数据库名.dbo.表名? --导入示例? select?*?into?表?from?ITSV.数据库名.dbo.表名? --以后不再使用时删除链接服务器? exec?sp_dropserver??'ITSV?',?'droplogins?'? ? --连接远程/局域网数据(openrowset/openquery/opendatasource)? --1、openrowset? select?*?from?openrowset(?'SQLOLEDB?',?'sql服务器名?';?'用户名?';?'密码?',数据库名.dbo.表名)? --生成本地表? select?*?into?表?from?openrowset(?'SQLOLEDB?',0); font-size:10.5pt">--把本地表导入远程表? insert?openrowset(?'SQLOLEDB?',255); font-size:10.5pt">select?*from?本地表? --更新本地表? update?b? set?b.列A=a.列A? ?from?openrowset(?'SQLOLEDB?',数据库名.dbo.表名)as?a?inner?join?本地表?b? on?a.column1=b.column1? --openquery用法需要创建一个连接? --首先创建一个连接创建链接服务器? --查询? select?*? FROM?openquery(ITSV,??'SELECT?*??FROM?数据库.dbo.表名?')? insert?openquery(ITSV,255); font-size:10.5pt">select?*?from?本地表? set?b.列B=a.列B? inner?join?本地表?b?on?a.列A=b.列A? --3、opendatasource/openrowset? SELECT???*? FROM???opendatasource(?'SQLOLEDB?',??'Data?Source=ip/ServerName;User?ID=登陆名;Password=密码?'?).test.dbo.roy_ta? insert?opendatasource(?'SQLOLEDB?',??'Data?Source=ip/ServerName;User?ID=登陆名;Password=密码?').数据库.dbo.表名? select?*?from?本地表?? SQL?Server基本函数 SQL?Server基本函数 1.字符串函数?长度与分析用? 1,datalength(Char_expr)?返回字符串包含字符数,但不包含后面的空格2,substring(expression,start,length)?取子串,字符串的下标是从“1”,start为起始位置,length为字符串长度,实际应用中以len(expression)取得其长度3,right(char_expr,int_expr)?返回字符串右边第int_expr个字符,还用left于之相反4,isnull(?check_expression?,?replacement_value?)如果check_expression為空,則返回replacement_value的值,不為空,就返回check_expression字符操作类? 5,Sp_addtype?自定義數據類型例如:EXEC?sp_addtype?birthday,?datetime,?'NULL' 6,set?nocount?{on|off} 使返回的结果中不包含有关受?Transact-SQL?语句影响的行数的信息。如果存储过程中包含的一些语句并不返回许多实际的数据,则该设置由于大量减少了网络流量,因此可显著提高性能。SET?NOCOUNT?设置是在执行或运行时设置,而不是在分析时设置。 SET?NOCOUNT?为?ON?时,不返回计数(表示受?Transact-SQL?语句影响的行数)。 常识 ? 在SQL查询中:from后最多可以跟多少张表或视图:256 在SQL语句中出现?Order?by,查询时,先排序,后取 在SQL中,一个字段的最大容量是8000,而对于nvarchar(4000),由于nvarchar是Unicode码。?? ? SQLServer2000同步复制技术实现步骤 一、?预备工作 1.发布服务器,订阅服务器都创建一个同名的windows用户,并设置相同的密码,做为发布快照文件夹的有效访问用户 --管理工具 --计算机管理 --用户和组 --右键用户 --新建用户 --建立一个隶属于administrator组的登陆windows的用户(SynUser) 2.在发布服务器上,新建一个共享目录,做为发布的快照文件的存放目录,操作: 我的电脑--D:?新建一个目录,名为:?PUB --右键这个新建的目录 --属性--共享 --选择"共享该文件夹" --通过"权限"按纽来设置具体的用户权限,保证第一步中创建的用户(SynUser)?具有对该文件夹的所有权限 ? --确定 3.设置SQL代理(SQLSERVERAGENT)服务的启动用户(发布/订阅服务器均做此设置) 开始--程序--管理工具--服务 --右键SQLSERVERAGENT --属性--登陆--选择"此账户" --输入或者选择第一步中创建的windows登录用户名(SynUser) --"密码"中输入该用户的密码 4.设置SQL?Server身份验证模式,解决连接时的权限问题(发布/订阅服务器均做此设置) 企业管理器 --右键SQL实例--属性 --安全性--身份验证 --选择"SQL?Server?和?Windows" 5.在发布服务器和订阅服务器上互相注册 --右键SQL?Server组 --新建SQL?Server注册... --下一步--可用的服务器中,输入你要注册的远程服务器名?--添加 --下一步--连接使用,选择第二个"SQL?Server身份验证" --下一步--输入用户名和密码(SynUser) --下一步--选择SQL?Server组,也可以创建一个新组 --下一步--完成 6.对于只能用IP,不能用计算机名的,为其注册服务器别名(此步在实施中没用到) ?(在连接端配置,比如,在订阅服务器上配置的话,服务器名称中输入的是发布服务器的IP) 开始--程序--Microsoft?SQL?Server--客户端网络实用工具 --别名--添加 --网络库选择"tcp/ip"--服务器别名输入SQL服务器名 --连接参数--服务器名称中输入SQL服务器ip地址 --如果你修改了SQL的端口,取消选择"动态决定端口",并输入对应的端口号 二、?正式配置 1、配置发布服务器 打开企业管理器,在发布服务器(B、C、D)上执行以下步骤: (1)?从[工具]下拉菜单的[复制]子菜单中选择[配置发布、订阅服务器和分发]出现配置发布和分发向导? (2)?[下一步]?选择分发服务器?可以选择把发布服务器自己作为分发服务器或者其他sql的服务器(选择自己) (3)?[下一步]?设置快照文件夹 采用默认servernamePub (4)?[下一步]?自定义配置? 可以选择:是,让我设置分发数据库属性启用发布服务器或设置发布设置 否,使用下列默认设置(推荐) (5)?[下一步]?设置分发数据库名称和位置?采用默认值 (6)?[下一步]?启用发布服务器?选择作为发布的服务器 (7)?[下一步]?选择需要发布的数据库和发布类型 (8)?[下一步]?选择注册订阅服务器 (9)?[下一步]?完成配置 2、创建出版物 发布服务器B、C、D上 (1)从[工具]菜单的[复制]子菜单中选择[创建和管理发布]命令 (2)选择要创建出版物的数据库,然后单击[创建发布] (3)在[创建发布向导]的提示对话框中单击[下一步]系统就会弹出一个对话框。对话框上的内容是复制的三个类型。我们现在选第一个也就是默认的快照发布(其他两个大家可以去看看帮助) (4)单击[下一步]系统要求指定可以订阅该发布的数据库服务器类型, SQLSERVER允许在不同的数据库如?orACLE或ACCESS之间进行数据复制。 但是在这里我们选择运行"SQL?SERVER?2000"的数据库服务器 (5)单击[下一步]系统就弹出一个定义文章的对话框也就是选择要出版的表 注意:?如果前面选择了事务发布?则再这一步中只能选择带有主键的表 (6)选择发布名称和描述 (7)自定义发布属性?向导提供的选择: 是?我将自定义数据筛选,启用匿名订阅和或其他自定义属性 否?根据指定方式创建发布?(建议采用自定义的方式) (8)[下一步]?选择筛选发布的方式? (9)[下一步]?可以选择是否允许匿名订阅 1)如果选择署名订阅,则需要在发布服务器上添加订阅服务器 方法:?[工具]->[复制]->[配置发布、订阅服务器和分发的属性]->[订阅服务器]?中添加 否则在订阅服务器上请求订阅时会出现的提示:改发布不允许匿名订阅 如果仍然需要匿名订阅则用以下解决办法? [企业管理器]->[复制]->[发布内容]->[属性]->[订阅选项]?选择允许匿名请求订阅 2)如果选择匿名订阅,则配置订阅服务器时不会出现以上提示 (10)[下一步]?设置快照?代理程序调度 (11)[下一步]?完成配置 当完成出版物的创建后创建出版物的数据库也就变成了一个共享数据库 有数据? srv1.库名..author有字段:id,name,phone,? srv2.库名..author有字段:id,telphone,adress? ? 要求:? srv1.库名..author增加记录则srv1.库名..author记录增加? srv1.库名..author的phone字段更新,则srv1.库名..author对应字段telphone更新? --*/? ? --大致的处理步骤? --1.在?srv1?上创建连接服务器,以便在?srv1?中操作?srv2,实现同步? exec?sp_addlinkedserver?'srv2','','SQLOLEDB','srv2的sql实例名或ip'? exec?sp_addlinkedsrvlogin?'srv2','false','用户名','密码'? go --2.在?srv1?和?srv2?这两台电脑中,启动?msdtc(分布式事务处理服务),并且设置为自动启动 。我的电脑--控制面板--管理工具--服务--右键?Distributed?Transaction?Coordinator--属性--启动--并将启动类型设置为自动启动? go? ? ? --然后创建一个作业定时调用上面的同步处理存储过程就行了? ? 企业管理器? --管理? --SQL?Server代理? --右键作业? --新建作业? --"常规"项中输入作业名称? --"步骤"项? --新建? --"步骤名"中输入步骤名? --"类型"中选择"Transact-SQL?脚本(TSQL)"? --"数据库"选择执行命令的数据库? --"命令"中输入要执行的语句:?exec?p_process? --确定? --"调度"项? --新建调度? --"名称"中输入调度名称? --"调度类型"中选择你的作业执行安排? --如果选择"反复出现"? --点"更改"来设置你的时间安排? ? ? 然后将SQL?Agent服务启动,并设置为自动启动,否则你的作业不会被执行? ? 设置方法:? 我的电脑--控制面板--管理工具--服务--右键?SQLSERVERAGENT--属性--启动类型--选择"自动启动"--确定.? ? ? --3.实现同步处理的方法2,定时同步? ? --在srv1中创建如下的同步处理存储过程? create?proc?p_process? as? --更新修改过的数据? update?b?set?name=i.name,telphone=i.telphone? from?srv2.库名.dbo.author?b,author?i? where?b.id=i.id?and (b.name?<>?i.name?or?b.telphone?<>?i.telphone)? ? --插入新增的数据? insert?srv2.库名.dbo.author(id,telphone)? select?id,telphone?from?author?i? where?not?exists(? select?*?from?srv2.库名.dbo.author?where?id=i.id)? ? --删除已经删除的数据(如果需要的话)? delete?b? from?srv2.库名.dbo.author?b? select?*?from?author?where?id=b.id) go (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- SQLServer导出数据到MySQL
- sqlserver2005-error:948
- sql – 从历史记录表中选择最新状态
- powershell connects to sqlserver
- sql – 如何在Hive中记录created_at和updated_at时间戳?
- Linux环境下mysql5.7.13安装教程
- SELECT语句中的列别名不适用于SQuirrel SQL Firebird
- sql-server-2008 – 编写自动SQLServer 2008 DR移动脚本
- sql-server – 基于SQL Server的EAV
- SQL Server:舍入十进制数并转换为int(在Select中)