存档

文章标签 ‘sql’

找回企业管理器

2008年6月2日 編程·程序設計 843 views

打开SQL Server企业管理器,突然弹出一个窗口,内容是: 错误提示: “Microsoft Management Console    —————————    MMC 不能打开文件 C:Program FilesMicrosoft SQL Server80ToolsBinnSQL Server Enterprise Manager.MSC。       这可能是由于文件不存在,不是一个 MMC 控制台,或者用后来版本的 MMC 创建。也可能是由于您没有访问此文件的足够权限。   郁闷,前一分钟还是好好的,怎么现在就出现这样的状况,打不开企业管理器。上网百度了一番,还有不少人跟我一样遇到这情况。具体见下面: 运行mmc,控制台–添加/删除管理单元–添加–找到Microsoft SQL 企业管理器–添加–关闭–确定(注:此处点击添加完后就可以关闭了,不要等待响应,如果你多次点击了添加,后来可以看到n多个sql企业管理器。。。),再回到控制台–选项–控制台模式选择”用户模式完全访问”–将下面的选择全部取消。最后,从控制台–另存为–存储为:C:Program FilesMicrosoft SQL Server80ToolsBINNSQL Server Enterprise Manager.MSC(即SqlServer的安装目录下的binn文件夹)。 实在不行的话,重新注册DLL 运行:regsvr32 C:Windowssystem32msxml3.dll 简单的方法,熟悉的企业管理器又回来了。

, ,

SQLServer中的@@IDENTITY,SCOPE_IDENTITY和IDENT_CURRENT

2008年3月28日 編程·程序設計 981 views

@@IDENTITY   返回最后插入的标识值。     语法   @@IDENTITY     返回类型   numeric     注释   在一条  INSERT、SELECT  INTO  或大容量复制语句完成后,@@IDENTITY  中包含此语句产生的最后的标识值。若此语句没有影响任何有标识列的表,则  @@IDENTITY  返回  NULL。若插入了多个行,则会产生多个标识值,@@IDENTITY  返回最后产生的标识值。如果此语句激发一个或多个执行产生标识值的插入操作的触发器,则语句执行后立即调用  @@IDENTITY  将返回由触发器产生的最后的标识值。若  INSERT  或  SELECT  INTO  语句失败或大容量复制失败,或事务被回滚,则  @@IDENTITY  值不会还原为以前的设置。     在返回插入到表的  @@IDENTITY  列的最后一个值方面,@@IDENTITY、SCOPE_IDENTITY  和  IDENT_CURRENT  函数类似。       @@IDENTITY  和  SCOPE_IDENTITY  将返回在当前会话的所有表中生成的最后一个标识值。但是,SCOPE_IDENTITY  只在当前作用域内返回值,而  @@IDENTITY  不限于特定的作用域。     [...]

, , ,

sql 添加删除字段

2008年2月1日 編程·程序設計 1,396 views

用sql脚本添加删除表里面字段的例子: SQL代码 use asm    ——–删除字段    if exists (select * from syscolumns where id =object_id(‘tb_log’) and name=‘COLUMN1′)    ALTER TABLE [tb_log ] DROP COLUMN [COLUMN1]       if exists (select * from syscolumns where id =object_id(‘tb_log’) and name=‘COLUMN2′)    ALTER TABLE [tb_log ] DROP COLUMN [COLUMN2]       if exists (select * from syscolumns where id =object_id(‘tb_log’) and name=‘COLUMN3′)    ALTER TABLE [tb_log ] DROP COLUMN [COLUMN3]       if exists (select * from syscolumns where id =object_id(‘tb_log’) and name=‘COLUMN4′)    ALTER TABLE [tb_log ] DROP COLUMN [COLUMN4]       ———添加字段    alter   table   tb_log         add    COLUMN5   nvarchar(200),                 COLUMN6  int  

, , ,

charindex的使用

2007年12月27日 編程·程序設計 1,175 views

早上在写个存储过程,给一个问题给拦住了。表a结构是 ID              Key 1               bot 2               asp 而现在传个参数@Name如’Botwave’,要从a表里查出包含该参数中的关键字的记录。 之前写过不少like查询,可都是参数匹配数据库,这次倒反过来了,够郁闷了。 上网搜了一遍,不知道该如何搜,最后还是阿KEN找到解决方法,原来用charindex便可解决。 故最后的SQL脚本如下: SQL代码 select top 1 * from a where charindex(Key,@Name) > 0     参考的内容如下: 引用: charindex和patindex详解   如何使用charindex函数              charindex函数返回字符或者字符串在另一个字符串中的起始位置。charindex函数调用方法如下:              charindex ( expression1 , expression2 )              expression1是要到expression2中寻找的字符中,start_location是charindex函数开始在expression2中找expression1的位置。              charindex函数返回一个整数,返回的整数是要找的字符串在被找的字符串中的位置。假如charindex没有找到要找的字符串,那么函数整数“0”。让我们看看下面的函数命令执行的结果:             charindex("sql", "microsoft sql server")             这个函数命令将返回在“microsoft sql server”中“sql”的起始位置,在这个例子中,charindex函数将返回“s”在“microsoft sql server”中的位置11。    接下来,我们看这个charindex命令:             charindex("7.0", "microsoft sql server 2000")             在这个例子中,charindex返回零,因为字符串“7.0” 不能在“microsoft sql server”中被找到。接下来通过两个例子来看看如何使用charindex函数来解决实际的t-sql问题。            第一个例子,假设你要显示northwind数据库customer表前5行联系人列的last name。这是前5行数据               contactname               ——————————                maria anders    [...]

, ,

使用TSQL创建作业

2007年11月10日 編程·程序設計 648 views

  SQL代码 if exists (select * from dbo.sysobjects where id = object_id(N‘[dbo].[p_createjob]‘) and OBJECTPROPERTY(id, N‘IsProcedure’) = 1)    drop procedure [dbo].[p_createjob]    GO       create proc p_createjob    @jobname varchar(100),             –作业名称    @sql varchar(8000),                –要执行的命令    @serverName sysname=”,            –job server名    @dbname sysname=”,                –默认为当前的数据库名    @freqtype varchar(6)=‘day’,        –时间周期,month 月,week 周,day 日    @fsinterval int=1,                 –相对于每日的重复次数    @time int=170000                   –开始执行时间,对于重复执行的作业,将从0点到23:59分    as   if isnull(@dbname,”)=” set @dbname=db_name()       –创建作业    exec msdb..sp_add_job @job_name=@jobname       –创建作业步骤    exec msdb..sp_add_jobstep @job_name=@jobname,            @step_name = ‘数据处理’,            @subsystem = ‘TSQL’,            @database_name=@dbname,            @command = @sql,            @retry_attempts = 5, –重试次数            @retry_interval = 5  –重试间隔       –创建调度    declare @ftype int,@fstype int,@ffactor int   select @ftype=case @freqtype when ‘day’ then 4 [...]

, ,

SQL Server的链接服务器技术小结

2007年11月10日 編程·程序設計 907 views

 一、使用 Microsoft OLE DB Provider For ODBC 链接MySQL 安装MySQL的ODBC驱动MyODBC 1、为MySQL建立一个ODBC系统数据源,例如:选择数据库为test ,数据源名称为 myDSN 2、建立链接数据库 SQL代码 EXEC sp_addlinkedserver  @server = ‘MySQLTest’, @srvproduct=‘MySQL’,@provider = ‘MSDASQL’, @datasrc = ‘myDSN’   GO    EXEC sp_addlinkedsrvlogin     @rmtsrvname=‘MySqlTest’,@useself=‘false’,@locallogin=‘sa’,@rmtuser=‘mysql的用户名’,@rmtpassword=‘mysql的密码’   3、查询数据 SQL代码 SELECT * FROM OPENQUERY (MySQLTest ,‘select * from 表’ )   下面这个不行: SQL代码 SELECT * FROM OPENQUERY (MySQLTest ,‘表’ )   注意:不能直接用select * from 链接服务器名.数据库名.用户名.表(或视图) 四部分名称查询数据,可能是个Bug. 二、使用 Microsoft OLE DB Provider For ORACLE 链接ORACLE 1、建立链接数据库 SQL代码 sp_addlinkedserver ‘别名’, ‘Oracle’, ‘MSDAORA’, ‘服务名’   GO    EXEC sp_addlinkedsrvlogin  @rmtsrvname=‘别名’,@useself=‘false’,@locallogin=‘sa’,@rmtuser=‘oracle用户名’,@rmtpassword=‘密码’   2、查询数据 SQL代码 SELECT * FROM 别名..用户名.表(视图)   注意:四部分名称全部用大写 3、执行存储过程 使用OPENQUERY: SQL代码 SELECT *    FROM OPENQUERY(别名, ‘exec 用户名.存储过程名’)   [...]

,

SQL Server中日期问题的解决

2007年11月10日 編程·程序設計 778 views

来源:http://www.vs2005.com/DataBase/225/1/default.aspx   在MS SQL Server 中,只有DATETIME型,日期和时间是合在一起的,比如2004-12-19 23:12:20。 有的时候,在SQL语句中,只要求取日期的话,的确比较麻烦,但也有以下的方法,归纳一下,比如要求取得2004-12-19日的记录,可以这样: A) WHERE DateDiff(dd, DateTimeColumn, ’12/19/2004′) = 0 B) WHERE Convert(varchar(20), DateTimeColumn, 101) = ’12/191/2004′ C) WHERE DateTimeColumn LIKE ’12/19/2004%’ D) WHERE Year(DateTimeColumn) = 2004 AND Month(DateTimeColumn) = 12 and Day(DateTimeColumn)=19

,

Sql Server基本函数

2007年11月10日 編程·程序設計 599 views

1.字符串函数 长度与分析用 datalength(Char_expr) 返回字符串包含字符数,但不包含后面的空格 substring(expression,start,length) 不多说了,取子串 right(char_expr,int_expr) 返回字符串右边int_expr个字符 字符操作类 upper(char_expr) 转为大写 lower(char_expr) 转为小写 space(int_expr) 生成int_expr个空格 replicate(char_expr,int_expr)复制字符串int_expr次 reverse(char_expr) 反转字符串 stuff(char_expr1,start,length,char_expr2) 将字符串char_expr1中的从 start开始的length个字符用char_expr2代替 ltrim(char_expr) rtrim(char_expr) 取掉空格 ascii(char) char(ascii) 两函数对应,取ascii码,根据ascii吗取字符 字符串查找 charindex(char_expr,expression) 返回char_expr的起始位置 patindex("%pattern%",expression) 返回指定模式的起始位置,否则为0 2.数学函数 abs(numeric_expr) 求绝对值 ceiling(numeric_expr) 取大于等于指定值的最小整数 exp(float_expr) 取指数 floor(numeric_expr) 小于等于指定值得最大整数 pi() 3.1415926……… power(numeric_expr,power) 返回power次方 rand([int_expr]) 随机数产生器 round(numeric_expr,int_expr) 安int_expr规定的精度四舍五入 sign(int_expr) 根据正数,0,负数,,返回+1,0,-1 sqrt(float_expr) 平方根 3.日期函数 getdate() [...]

,

存储过程编写经验和优化措施

2007年11月10日 編程·程序設計 667 views

介绍:在数据库的开发过程中,经常会遇到复杂的业务逻辑和对数据库的操作,这个时候就会用SP来封装数据库操作。如果项目的SP较多,书写又没有一定的规范,将会影响以后的系统维护困难和大SP逻辑的难以理解,另外如果数据库的数据量大或者项目对SP的性能要求很,就会遇到优化的问题,否则速度有可能很慢,经过亲身经验,一个经过优化过的SP要比一个性能差的SP的效率甚至高几百倍。 内容: 1、开发人员如果用到其他库的Table或View,务必在当前库中建立View来实现跨库操作,最好不要直接使用“databse.dbo.table_name”,因为sp_depends不能显示出该SP所使用的跨库table或view,不方便校验。 2、开发人员在提交SP前,必须已经使用set showplan on分析过查询计划,做过自身的查询优化检查。 3、高程序运行效率,优化应用程序,在SP编写过程中应该注意以下几点: a)        SQL的使用规范: i.  尽量避免大事务操作,慎用holdlock子句,提高系统并发能力。 ii. 尽量避免反复访问同一张或几张表,尤其是数据量较大的表,可以考虑先根据条件提取数据到临时表中,然后再做连接。 iii.尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该改写;如果使用了游标,就要尽量避免在游标循环中再进行表连接的操作。 iv. 注意where字句写法,必须考虑语句顺序,应该根据索引顺序、范围大小来确定条件子句的前后顺序,尽可能的让字段顺序与索引顺序相一致,范围从大到小。 v.  不要在where子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。 vi. 尽量使用exists代替select count(1)来判断是否存在记录,count函数只有在统计表中所有行数时使用,而且count(1)比count(*)更有效率。 vii.尽量使用“>=”,不要使用“>”。 viii.注意一些or子句和union子句之间的替换 ix.注意表之间连接的数据类型,避免不同类型数据之间的连接。 x. 注意存储过程中参数和数据类型的关系。 xi.注意insert、update操作的数据量,防止与其他应用冲突。如果数据量超过200个数据页面(400k),那么系统将会进行锁升级,页级锁会升级成表级锁。 b) 索引的使用规范: i.  索引的创建要与应用结合考虑,建议大的OLTP表不要超过6个索引。 ii. 尽可能的使用索引字段作为查询条件,尤其是聚簇索引,必要时可以通过index index_name来强制指定索引 iii.避免对大表查询时进行table scan,必要时考虑新建索引。 iv. 在使用索引字段作为条件时,如果该索引是联合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用。 v.  要注意索引的维护,周期性重建索引,重新编译存储过程。 c)tempdb的使用规范: i.  尽量避免使用distinct、order by、group by、having、join、cumpute,因为这些语句会加重tempdb的负担。 ii. 避免频繁创建和删除临时表,减少系统表资源的消耗。 iii.在新建临时表时,如果一次性插入数据量很大,那么可以使用select into代替create table,避免log,提高速度;如果数据量不大,为了缓和系统表的资源,建议先create table,然后insert。 iv. 如果临时表的数据量较大,需要建立索引,那么应该将创建临时表和建立索引的过程放在单独一个子存储过程中,这样才能保证系统能够很好的使用到该临时表的索引。 v.  如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先truncate table,然后drop table,这样可以避免系统表的较长时间锁定。 vi. 慎用大的临时表与其他大表的连接查询和修改,减低系统表负担,因为这种操作会在一条语句中多次使用tempdb的系统表。 d)合理的算法使用: 根据上面已提到的SQL优化技术和ASE Tuning手册中的SQL优化内容,结合实际应用,采用多种算法进行比较,以获得消耗资源最少、效率最高的方法。具体可用ASE调优命令:set [...]

, ,

SQL Server 数据库管理常用的SQL和T-SQL语句

2007年11月10日 編程·程序設計 605 views

1. 查看数据库的版本 select @@version 2. 查看数据库所在机器操作系统参数 exec master..xp_msver 3. 查看数据库启动的参数 sp_configure 4. 查看数据库启动时间 select convert(varchar(30),login_time,120) from master..sysprocesses where spid=1 查看数据库服务器名和实例名 print ‘Server Name……………: ‘ + convert(varchar(30),@@SERVERNAME) print ‘Instance………………: ‘ + convert(varchar(30),@@SERVICENAME) 5. 查看所有数据库名称及大小 sp_helpdb 重命名数据库用的SQL sp_renamedb ‘old_dbname’, ‘new_dbname’ 6. 查看所有数据库用户登录信息 sp_helplogins 查看所有数据库用户所属的角色信息 sp_helpsrvrolemember 修复迁移服务器时孤立用户时,可以用的fix_orphan_user脚本或者LoneUser过程 更改某个数据对象的用户属主 sp_changeobjectowner [@objectname =] ‘object’, [@newowner =] ‘owner’ 注意: 更改对象名的任一部分都可能破坏脚本和存储过程。 把一台服务器上的数据库用户登录信息备份出来可以用add_login_to_aserver脚本 [...]

, ,