Sql Server问题集锦
Sql数据库默认实例和命名实例的区别:
1、服务中服务名称的区别:
- 默认实例:MSSQLSERVER;
- 命名实例:实列名为:benet,在服务中的名称是:MSSQL$BENET;
- 默认实例可以使用:“.”(点)、“(local)”、“计算机名称”、“localhost”
- 实例名称:计算机名:pcname,实例名:benet,连接时使用的名称是:pcname\benet
3、端口区别
- 默认实例:1433
- 命名实例:1434
4. 安装Sql Server2008 R2版遇到问题:
TITLE: Microsoft SQL Server 2008 R2 Setup
------------------------------
The following error has occurred:
Could not open key: UNKNOWN\Components\00C004FEE241478418DBB8505B78CBC5\FC38113FF01E1ED4BB95C6F03FE884E1. Verify that you have sufficient access to that key, or contact your support personnel.
For help, click: http://go.microsoft.com/fwlink?LinkID=20476&ProdName=Microsoft+SQL+Server&EvtSrc=setup.rll&EvtID=50000&ProdVer=10.50.1600.1&EvtType=0xDF039760%25401201%25401
------------------------------
BUTTONS:
OK
------------------------------
遇到此问题点击Continue,继续就可以了。
sqlserver安装一半断电后重新安装,不成功,卸载掉sqlserver后出现以上问题,就在卸载掉sqlserver后重启电脑后,以管理员身份打开cmd窗口,执行下面这一句代码:
secedit /configure /cfg %windir%\inf\defltbase.inf /db defltbase.sdb /verbose
执行完后在重新安装sqlserver2008r2就可以了。
卸载sqlserver,需要操作的地方:控制面板-卸载程序-找到Microsoft Sql Server 2008 R2(64-bit),按着提示步骤执行卸载就ok;把注册表与Microsoft Sql Server相关的内容删除掉;系统盘sql安装目录Miscrosolft Sql Server文件夹删掉。
sqlserver注册表:
1.HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Session Manager中(看右边)找到PendingFileRenameOperations值并删除它
2.HKEY_CURRENT_USER\Software\Microsoft\Microsoft SQL Server
3.HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server
4.HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer
5.truncate 和 delete区别:
delete/truncate只删除表数据不删除表结构
delete操作后存储到rollback segement回滚段中事务提交之后才生效,如果有相应的trigger,执行时会被触发;truncate/drop操作后立即生效,源数据不放到rollback segement,不回滚不触发trigger
delete : 1.DML语音;2.可以回退;3.可以有条件的删除;(自增字段保留原来最大数值);
truncate: 1.DDL语音;2.无法回退;3.删除所有行;4.比delete效率快(自增字段开始从头计数)
drop:删除表结构及与表相关的约束constrain、触发器trigger、索引index,但依赖该表的存储过程stored procedure/函数function保留但是状态变为invalid
DML=Data Manipulation Language:对数据库里的数据进行操作的语音,比如:Select/Insert/Update/Delete
DDL=Data Definition Language:定义或改变表结构、数据类型、约束和表之间链接等等,比如:Create/Alter/Drop
DCL=Data Control Language:设置或更改数据库用户或角色权限语句,比如:grant/deny/reoke
6.sql server 2005以上版本,外围应用配置器(Surface Area Configuration)已不是独立的模块,默认是允许远程连接的,不需要再外围应用配置器中进行设置。可以在这里找到:打开sql server visual studio,登录sql server,右击服务器名称,点击“方面”(Facets),在弹出窗口的右侧下拉框里找到“外围应用配置器”(Surface Area Configuration)
7.xp_cmdshell 扩展存储过程将命令字符串作为操作系统命令 shell 执行,并以文本行的形式返回所有输出。
xp_cmdshell组件作为sql server 安全配置的一部分被禁用了,可以通过sp_configure启用它,sql脚本如下:
sp_configure 'show advanced options',1 reconfigure go sp_configure 'xp_cmdshell',1 reconfigure go
需要关闭xp_cmdshell的话,只将1改为0
xp_cmdshell 语法:
xp_cmdshell { 'command_string' } [ , no_output ]
‘command string’ 包含传递到操作系统的命令的字符串,‘no_output’可选参数,指定不返回任何输出。
返回结果:0成功,1失败
例如:exec xp_cmdshell 'copy path1 path2'可以把文件从一个路径复制到另一个路径下。注意事项:在执行复制文件命令时可能会遇到权限问题,可以通过sql net use命令登录目标服务器
EXEC master.sys.xp_cmdshell 'net use \\服务器名或IP\ipc$ password /user:username',然后再执行复制文件命令就可以了。
9. 纪念一下,使用了这么多年的sql server,竟不知sql表中有“计算列(Computed)”,创建该计算列方法:
create table table1
(
number decimal(18,4),
price money,
Amount as number*price --这里就是计算列
)
计算列是不需要我们指定数据类型与是否允许为null等信息的,SqlServer会根据情况自动赋予数据类型
使用SSMS创建“计算列”:打开“设计表格”窗口,在column属性中有一项“计算所得列的规范(Computed column specification)”,展开,公式(Formula) 写计算公式,是否持久(Is Persisted)
计算列如果没有特殊的设定,它将会是一个虚拟列,也就是这个列实际上是不存在的,只是每次要取这列的值时,sql会按照计算列的公式计算一次,再把结果返回给我们。这样就会存在一些问题,比如,每次计算都会消耗一定的时间,而且也不能在这个列上创建索引。那么能不能把计算列的结果存起来,每次取数据的时候直接把结果返回给我们,而不用每次去计算。呵呵,恭喜你,创建计算列时把"是持久的"这个选项勾起来,就能达到我们的目的了,这时候,计算列就是一个实实在在的列,也可以在该列上创建索引了。
注意:
1,计算列如果没有设置为"是持久的",那么它是不可以用来做check,foreign key或not null约束。当然,如果我们在microsoft sql server management studio为计算列设置了check等约束了,sql server会自动将该列设置为"是持久的"。
2,计算列不可以再次用来作为中一个计算列的一部分。
3,在触发器,不可以对计算列进行update判断,否则会报如下错误:
列”不能在IF UPDATE子句中使用,因为它是计算列。”
9.重置自增列:
--- 删除原表数据,并重置自增列
truncate table tablename --truncate方式也可以重置自增字段
--重置表的自增字段,保留数据
DBCC CHECKIDENT (tablename,reseed,0)
-- 设置允许显式插入自增列
SET IDENTITY_INSERT tablename ON
-- 当然插入完毕记得要设置不允许显式插入自增列
SET IDENTITY_INSERT tablename Off
10. Distributed transaction-分布式事务
创建link server时,有个选项是“Enable promotion of Distributed Transactions for RPC”,设置为true 表示启用分布式事务,前提是保证两个或多个数据库服务器都启用了Distributed Transaction coordinator服务,如未做设置会报错“OLE DB provider "SQLNCLI11" for linked server "HKSQLPWV034" returned message "The transaction manager has disabled its support for remote/network transactions." ”;设置false就不会报这个错了
11.sql server数据库中不能识别的空格 ascii 160 ,可以识别的空格是 ascii 32
把ascii 160空格替换掉:replace(@str,char(160),'')
12. 定时执行sql server job时,报错:
Executed as user: CN\CNSHASQLPWV749sqlagt. Login failed. The login is from an untrusted domain and cannot be used with Windows authentication. [SQLSTATE 28000] (Error 18452). The step failed.
这个时候需要去检查Job调用的存储过程或执行的T-Sql语句中,是否包含Link server?创建的Link server是否没有问题,是否指定了链接服务器的账号和密码?如果没有指定账号和密码则需要重新创建Link server.
13.sql server创建用户,如果提示该用户已存在,请检查各个数据库下是否有该用户,如果有则删除掉,然后再重新创建该用户及分配权限
14.sql server创建完用户后,我建议要重启一下数据库服务
15.附加没有日志文件的数据库的方法,
1.新建同名的数据库文件
2.暂停SQLSetver服务
3.将原先的mdf文件,覆盖新建的数据库,删除新数据库的ldf文件
4.重新启动SQLSetver服务 ,这时看到的数据库是这个样子的,打不开
5.执行以下SQL语句
1 --1.设置为紧急状态
2 alter database 数据库名称 set emergency 3 --2.设置为单用户模式 4 alter database 数据库名称 set single_user 5 --3.检查并重建日志文件 6 dbcc checkdb('数据库名称',REPAIR_ALLOW_DATA_LOSS) 7 --4.第3步操作如果有错误提示,运行第4步,没有错误则跳过 8 dbcc checkdb('数据库名称',REPAIR_REBUILD) 9 --5.恢复成多用户模式 10 alter database 数据库名称 set multi_user
16.数据库日志备份失败,失败原因:某数据库的恢复模式是simple,不允许使用backup log语句,
选中数据库名,鼠标右击选择property属性,然后选择左侧“Options”选项卡,修改数据库的恢复模式,从Simple修改为Full,保存修改。切记保存修改后要先手动重新备份一下数据库,然后再执行数据库日志备份job,该jog就可以执行成功了。
17.在线数据库和还原新的数据库(在线数据库的备份文件)在同一台服务器上,备份文件还原出一个新的数据库名+日期后缀,还原好后,在线数据库状态变成restoring,该状态下在线数据库无法访问
解决办法:执行此条sql语句restore database dwh_stage_pwr with recovery,在线数据库状态就恢复正常了
18.鼠标右击数据库名称,选择属性,报错,内容如下
Property Owner is not available for Database 'dbname'. This property may not exist for this object, or may not be retrievable due to insufficient access rights. (Microsoft.SqlServer.Smo)
1)在master数据库下执行sp_helpdb dbname, 查看dbname的owner字段是不是NULL or ~~UNKNOWN~~ ,一般情况下是数据库的owner不存在了
2)选中有此问题的数据库,执行sp_changedbowner 'sa' 更改数据库 owner为sa,
执行以上两步,数据库属性窗口就能打开了
19. SSMS tool打开超过5GB文件提示文件太大。
![](https://img2023.cnblogs.com/blog/457667/202303/457667-20230324173415442-2044659232.png)
以管理员身份打开命令行窗口,执行该命令“sqlcmd -S 数据库服务器地址 -U sql admin角色账号 -P 账号密码 -i "sql脚本文件路径" ”敲回车