sql server中利用备份建立数据库

经常的,从网站上备份了数据下来,想在本地查看数据,却总是无从下手,因为备份的数据库并不能直接在sql Server中使用。

使用方法:

1.建立一个空的数据库test

2.还原test数据库

选择备份的数据库文件test.bak

这时候,如果直接还原,会提示

标题: Microsoft SQL Server Management Studio
——————————

还原 对于 服务器“NEWMAPSERVER”失败。  (Microsoft.SqlServer.Smo)

有关帮助信息,请单击: http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&ProdVer=9.00.3042.00&EvtSrc=Microsoft.SqlServer.Management.Smo.ExceptionTemplates.FailedOperationExceptionText&EvtID=还原+Server&LinkId=20476

——————————
其他信息:

System.Data.SqlClient.SqlError: 备份集中的数据库备份与现有的 ‘test’ 数据库不同。 (Microsoft.SqlServer.Smo)

有关帮助信息,请单击: http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&ProdVer=9.00.3042.00&LinkId=20476

——————————

解决办法:选中还原选项“覆盖现有数据库”

image

再还原,就没有问题了。

3.查看还原完的数据库test,就可以看到备份下来的数据了。

sqlserver 2005 还原无法登录

问题:

把远程的数据库(假设为db1)备份下来,本地还原后,提示用户无法登录。

远程和本地的数据库结构是一样的,有专门的用户(user1)用于管理该数据库。

解答:

还原后,把数据库用户也一并还原,可能本地的用户(user1)和远程的是内部编号不一样,导致本地的用户无法绑定到新还原的数据库。

查看该数据库(db1)的安全性——用户,看到user1用户名是一样的,但是,登录名是空的,就是无法登录了。查看全局用户的user1,可以看到没有任何权限,只是public的权限,也没有对db1的控制权。

解决办法:

删除db1下的user1,设置全局用户user1是db1的db_owner,确定。

重新查看,就可以看在db1下看到user1用户了,并且登录名是user1,重新登录,OK。

设置SQLServer 2005 代理的帐号密码

问题:

使用sql server 2005 的维护计划时,老是出现执行失败,看到sqlserver代理服务没有启动,查看日志:

由于下列错误,SQL Server Agent (MSSQLSERVER) 服务启动失败:  由于登录失败而无法启动服务。

打开设置:

开始菜单——>Microsoft SQL server 2005——>配置工具——>SqlServer 配置管理器

选择“SqlServer 2005 服务”,右边 选择agent,右键“属性”,帐号密码就出现在眼前了。

 

image

image

sqlserver null转换和数据精度问题

把null的结果转换为0

isnull(afield,0)

如果afield的结果是null,就返回0,当然,可以把0转换为其他字段的值,如bfield

isnull(afield,bfield)

这在bfield在没有填写的时候,默认为afield的值,这样的情况下,最为有用

——————————————————————

数据精度:

用round

ROUND ( numeric_expression, length [ , function ] )  

如果要把afield的值,取两位小数,则为

round(afield,2) as afield

SQL Server 中从表结果串联问题

问题:
假设环境如下:
    表1:      ID, NAME,      QQ,     PHONE,
表中数据:1       秦云        10102800 13500000
                2       在路上      10378    13600000
                3       LEO         10000    13900000

    表2:      ID, NAME,  上机时间,管理员,
表中数据:     1   秦云    2004-1-1  李大伟
               2   秦云    2005-1-1  马化腾
              3    在路上  2005-1-1  马化腾
               4    秦云   2005-1-1  李大伟
               5   在路上 2005-1-1  李大伟

实现目的:从表1中取所有人员列表,从表2中取上机次数和管理员.

             上机人员名单    上机次数   管理员(上这几次机的每个管理员都列出)
               秦云             3             李大伟,马化腾,李大伟
               在路上           2            马化腾,李大伟
               LEO              0

就是要把从表的结果串联起来。

曾经试过,在本地,通过添加一个计算字段,来进行计算,在显示大量数据的时候,会引起程序瘫痪,好像来回的数据量很大,基本上不可接受这个速度。

解决办法:

就是在服务器上使用函数。比较而言,性能真的提高很多。

就是使用游标编写sql server 函数。

参考:SQL Server 中 自定义函数 和 游标 应用的经典案例_数据库文摘_开发文摘_软件开发_天新网

SQL Server 自增字段归零等问题

在多次插入数据后,自增的ID号比较混乱,而且删除数据后,自增的ID并不会归零,经过多方查阅,了解到有两种方法可以控制自增的字段:

方法一:    如果曾经的数据都不需要的话,可以直接清空所有数据,并将自增字段恢复从1开始计数 

truncate table 表名

重新插入数据后,就是重新从1开始了,当然也可以设为从任意数字开始。

继续阅读

SQL Server 返回最后插入记录的自动编号ID

 SQL Server 返回最后插入记录的自动编号ID
最近在开发项目的过程中遇到这么一个问题,就是在插入一条记录的后立即获取其在数据库中自增的ID,以便处理相关联的数据,怎么做?在sql server 2000中可以这样做,有几种方式。详细请看下面的讲解与对比。
一、要获取此ID,最简单的方法就是:(以下举一简单实用的例子)
–创建数据库和表

create database MyDataBase
use MyDataBase
create table mytable
(
id int identity(1,1),
name varchar(20)
)

–执行这个SQL,就能查出来刚插入记录对应的自增列的值
insert into mytable values(‘李四’)
select @@identity
二、三种方式的比较
SQL Server 2000中,有三个比较类似的功能:他们分别是:SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY,它们都返回插入到 IDENTITY 列中的值。
IDENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值。IDENT_CURRENT 不受作用域和会话的限制,而受限于指定的表。IDENT_CURRENT 返回为任何会话和作用域中的特定表所生成的值。
@@IDENTITY 返回为当前会话的所有作用域中的任何表最后生成的标识值。
SCOPE_IDENTITY 返回为当前会话和当前作用域中的任何表最后生成的标识值
SCOPE_IDENTITY 和 @@IDENTITY 返回在当前会话中的任何表内所生成的最后一个标识值。但是,SCOPE_IDENTITY 只返回插入到当前作用域中的值;@@IDENTITY 不受限于特定的作用域。
例如,有两个表 T1 和 T2,在 T1 上定义了一个 INSERT 触发器。当将某行插入 T1 时,触发器被激发,并在 T2 中插入一行。此例说明了两个作用域:一个是在 T1 上的插入,另一个是作为触发器的结果在 T2 上的插入。
假设 T1 和 T2 都有 IDENTITY 列,@@IDENTITY 和 SCOPE_IDENTITY 将在 T1 上的 INSERT 语句的最后返回不同的值。
@@IDENTITY 返回插入到当前会话中任何作用域内的最后一个 IDENTITY 列值,该值是插入 T2 中的值。
SCOPE_IDENTITY() 返回插入 T1 中的 IDENTITY 值,该值是发生在相同作用域中的最后一个 INSERT。如果在作用域中发生插入语句到标识列之前唤醒调用 SCOPE_IDENTITY() 函数,则该函数将返回 NULL 值。
而IDENT_CURRENT(‘T1’) 和 IDENT_CURRENT(‘T2’) 返回的值分别是这两个表最后自增的值。

ajqc的实验:(40条本地线程,40+40条远程线程同时并发测试,插入1200W行),得出的结论是:
1.在典型的级联应用中.不能用@@IDENTITY,在CII850,256M SD的机器上1W多行时就会并发冲突.在P42.8C,512M DDR上,才6000多行时就并发冲突.
2.SCOPE_IDENTITY()是绝对可靠的,可以用在存储过程中,连触发器也不用建,没并发冲突
SELECT   IDENT_CURRENT(‘TableName’)   –返回指定表中生成的最后一个标示值   
SELECT   IDENT_INCR(‘TableName’)–返回指定表的标示字段增量值
SELECT   IDENT_SEED(‘TableName’)–返回指定表的标示字段种子值
返回最后插入记录的自动编号
SELECT IDENT_CURRENT(‘TableName’)
返回下一个自动编号:   
SELECT   IDENT_CURRENT(‘TableName’)   +   (SELECT   IDENT_INCR(‘TableName’))
SELECT @@IDENTITY –返回当前会话所有表中生成的最后一个标示值
以上是针对sql server 2000的情况,但是诸如my sql或oracle中如何实现呢?怎么处理呢?本人也在摸索中。。。。如有朋友知道此处理方式,别忘了告之,一同分享!
该文章转载自网络大本营:[url=http://www.xrss.cn/Dev/DataBase/200782315970.Html]http://www.xrss.cn/Dev/DataBase/200782315970.Html[/url]

SQL Server 返回最后插入记录的自动编号ID(页 1) – SQL Server应用开发 – 微软SQL Server专区 – 51CTO技术论坛

SQL Server 2000无法用IP连接

环境:windows XP sp2 + Sql Server 2000 开发版

现象:

用ip无法连接服务器,显示不存在

用(LOCAL)可以连接

telnet 1433

不能打开到主机的连接, 在端口 1433: 连接失败

事件查看器:

事件类型:    信息
事件来源:    MSSQLSERVER/MSDE
事件种类:    无
事件 ID:    5400
日期:        2007-10-29
事件:        17:20:14
用户:        N/A
计算机:    WUMY-SUNRISE
描述:
您正在运行的 Microsoft SQL Server 2000 或 Microsoft SQL Server 2000 桌面引擎(又称 MSDE)的版本包含已知的与 Windows 的 此版本一起使用时的漏洞。要减少计算机的漏洞,免受特定病毒 攻击,应该禁用 Microsoft SQL Server 2000、MSDE (或同时)的  TCP/IP 和 UDP 网络端口。要启用这些端口,您必须从 http://www.microsoft.com/sql/downloads/default.asp  安装修补程序,或 Microsoft SQL Server 2000 或 MSDE 的 最新 service pack。

有关更多信息,请参阅在 http://go.microsoft.com/fwlink/events.asp 的帮助和支持中心。

 

事件类型:    警告
事件来源:    MSSQLServer
事件种类:    (8)
事件 ID:    19011
日期:        2007-10-29
事件:        17:20:14
用户:        N/A
计算机:    WUMY-SUNRISE
描述:
SuperSocket 信息: (SpnRegister) : Error 1355。

有关更多信息,请参阅在 http://go.microsoft.com/fwlink/events.asp 的帮助和支持中心。

解决办法:

下载补丁,安装