Sql Server问题集锦

Sql数据库默认实例和命名实例的区别:

1、服务中服务名称的区别:

  • 默认实例:MSSQLSERVER;
  • 命名实例:实列名为:benet,在服务中的名称是:MSSQL$BENET;
  注:如果你有多个实例的时候会在服务中出现多个服务名称,一个实例对应一个服务。
2、连接到查询分析器或探查器的连接字符串的区别:
  • 默认实例可以使用:“.”(点)、“(local)”、“计算机名称”、“localhost”
  • 实例名称:计算机名:pcname,实例名:benet,连接时使用的名称是:pcnameenet

3、端口区别

  • 默认实例:1433
  • 命名实例:1434    

4. 安装Sql Server2008 R2版遇到问题:

TITLE: Microsoft SQL Server 2008 R2 Setup
------------------------------

The following error has occurred:

Could not open key: UNKNOWNComponents0C004FEE241478418DBB8505B78CBC5FC38113FF01E1ED4BB95C6F03FE884E1. 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%infdefltbase.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_USERSoftwareMicrosoftMicrosoft SQL Server

  3.HKEY_LOCAL_MACHINESOFTWAREMicrosoftMicrosoft SQL Server

  4.HKEY_LOCAL_MACHINESOFTWAREMicrosoftMSSQLServer

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 \服务器名或IPipc$ password /user:username',然后再执行复制文件命令就可以了
8.merge语句语法
MERGE [hint] INTO [schema ] table [t_alias]
USING [schema ]{ table | view | subquery } [t_alias]
ON ( condition )
WHEN MATCHED THEN merge_update_clause
WHEN NOT MATCHED THEN merge_insert_clause;
 
第一行 命名目标表并给别名T1
第二行 using子句提供merge操作的数据源,命名T
第三行 on子句指定合并的条件
第四行 when matched then 子句判定条件符合则对表T1做什么改变(或删除)
第五行 when not matched then 子句判断条件不符合则插入的操作

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: CNCNSHASQLPWV749sqlagt. 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就可以执行成功了。


原文地址:https://www.cnblogs.com/dxmdiy/p/4610301.html