发布新日志

  • 附加SQL Server数据库时为只读的解决办法(转载)

    2010-03-31 11:52:35

    现象:
        运行.Net的程序时,提示数据库是只读的。
    • 运行 SQL Server Management Studio(开始,运行:Sqlwb):
    http://static16.photo.sina.com.cn/orignal/3f2ef118083c2b8db812f
        从配置文件,看不出有什么问题,已经具有最高权限了,应该不影响读写。但是从数据库列表中我们却发现附件的数据库是“只读”状态。这应该是导致不能修改数据的原因。

    原因:

    • 附加数据库时,数据库文件的属性是只读。
    • 运行SQL Server实例的帐户对附加的数据库文件不具备相应的修改权限。

    解决办法:

    • 取消文件的只读属性。
    http://static9.photo.sina.com.cn/orignal/3f2ef118c8ae17c8ac1c8
        在取消文件的“只读”属性后,查看数据库属性可能仍然是“只读”的,可能还需要进行下面的操作。
    • 查看运行SQL Server实例的帐户。
        在服务(Services.msc)管理控制台中或者SQL Server配置管理器(Configuration Manager)中查看:
    http://static16.photo.sina.com.cn/orignal/3f2ef1183d9f1f3fc3f7f
    • 如上图所示,如果启动SQL Server实例的帐户是Network Service,那么将其修改为Local Service,然后重新启动SQL Server实例。如果是指定的帐号用于启动SQL Server实例,那么进行下面操作。
    http://static7.photo.sina.com.cn/orignal/3f2ef1187e2433cf3fce6
    • 修改文件安全属性。
    http://static10.photo.sina.com.cn/orignal/3f2ef118cfbbedd18d009
        如图所示,将本例中运行SQL Server实例的帐户SqlBoot添加到对物理文件Contacts.mdf的访问权限列表中。如果存在日志文件,相应地,日志文件属性也应添加。其实,这里我们发现,在上面也可以不修改启动SQL Server实例的帐户,直接将启动SQL Server实例的帐户Network Service或者Local Service添加到对数据库物理文件的访问权限列表中即可。
       
    附:

    •  附件数据库的T-SQL语句:
        CREATE DATABASE Contacts
        ON (filename='C:\Program Files\Microsoft ASP.NET\ASP.NET AJAX Sample Applications\v1.0.61025\Contacts\App_Data\Contacts.mdf')
        FOR ATTACH
    • 关于之前使用“sp_attach_db”附加数据库,微软建议不要继续使用。”重要事项:后续版本的 Microsoft SQL Server 将删除该功能。请避免在新的开发工作中使用该功能,并应着手修改当前还在使用该功能的应用程序。我们建议您改用 CREATE DATABASE database_name FOR ATTACH。“
  • MS-SQL数据库系统表的总结与应用

    2010-03-17 11:10:49

    有一个是用Rollback Transaction来回滚操作


    Select * From master.dbo.sysdatabases   查询本数据库信息

    ---------------------------------------------------------------------------------------------------------------------------
    Sysobjects:SQL-SERVER的每个数据库内都有此系统表,它存放该数据库内创建的
    所有对象,如约束、默认值、日志、规则、存储过程等,每个对象在表中占一行。
    对象类型(xtype)。可以是下列对象类型中的一种:
    C = CHECK 约束
    D = 默认值或 DEFAULT 约束
    F = FOREIGN KEY 约束
    L = 日志
    FN = 标量函数
    IF = 内嵌表函数
    P = 存储过程
    PK = PRIMARY KEY 约束(类型是 K)
    RF = 复制筛选存储过程
    S = 系统表
    TF = 表函数
    TR = 触发器
    U = 用户表
    UQ = UNIQUE 约束(类型是 K)
    V = 视图
    X = 扩展存储过程
    当xtype='U' and status>0代表是用户建立的表,对象名就是表名,对象ID就是表
    ---------------------------------------------------------------------------------------------------------------------------
    syscolumns :每个表和视图中的每列在表中占一行,存储过程中的每个参数在表
    Select c.*,t.name
    From dbo.syscolumns c  left join dbo.systypes t on c.xtype=t.xtype
    where c.id in (Select id From sysobjects
                 where name='NET_User')
    ---------------------------------------------------------------------------------------------------------------------------
    Select * From sysaltfiles    主数据库               保存数据库的文件
    Select * From syscharsets    主数据库               字符集与排序顺序
    Select * From sysconfigures  主数据库               配置选项
    Select * From syscurconfigs  主数据库               当前配置选项
    Select * From sysdatabases   主数据库               服务器中的数据库
    Select * From syslanguages   主数据库               语言
    Select * From syslogins      主数据库               登陆帐号信息
    Select * From sysoledbusers  主数据库               链接服务器登陆信息
    Select * From sysprocesses   主数据库               进程
    Select * From sysremotelogins 主数据库               远程登录帐号
    Select * From syscolumns     每个数据库             列
    Select * From sysconstrains  每个数据库             限制
    Select * From sysfilegroups  每个数据库             文件组
    Select * From sysfiles       每个数据库             文件
    Select * From sysforeignkeys 每个数据库             外部关键字
    Select * From sysindexes      每个数据库             索引
    Select * From sysmembers     每个数据库             角色成员
    Select * From sysobjects     每个数据库             所有数据库对象
    Select * From syspermissions 每个数据库             权限
    Select * From systypes       每个数据库             用户定义数据类型
    Select * From sysusers       每个数据库             用户

    sql server系统表详细说明
    sysaltfiles 主数据库 保存数据库的文件
    syscharsets 主数据库字符集与排序顺序
    sysconfigures 主数据库 配置选项
    syscurconfigs 主数据库当前配置选项
    sysdatabases 主数据库服务器中的数据库
    syslanguages 主数据库语言
    syslogins 主数据库 登陆帐号信息
    sysoledbusers 主数据库 链接服务器登陆信息
    sysprocesses 主数据库进程
    sysremotelogins主数据库 远程登录帐号
    syscolumns 每个数据库 列
    sysconstrains 每个数据库 限制
    sysfilegroups 每个数据库 文件组
    sysfiles 每个数据库 文件
    sysforeignkeys 每个数据库 外部关键字
    sysindexs 每个数据库 索引
    sysmenbers 每个数据库角色成员
    sysobjects 每个数据库所有数据库对象
    syspermissions 每个数据库 权限
    systypes 每个数据库 用户定义数据类型
    sysusers 每个数据库 用户

    ---------------------------------------------------------------------------------------------------------------------------
    SELECT OBJECT_NAME (id) [OBJECT_NAME] FROM sysobjects WHERE xtype = 'U' AND OBJECTPROPERTY (id, 'IsMSShipped') = 0

    SELECT    
                              表名=case   when   a.colorder=1   then   d.name   else   ''   end,  
                              表说明=case   when   a.colorder=1   then   isnull(f.value,'')   else   ''   end,  
                              字段序号=a.colorder,  
                              字段名=a.name,  
                              标识=case   when   COLUMNPROPERTY(   a.id,a.name,'IsIdentity')=1   then   '√'else   ''   end,  
                              主键=case   when   exists(SELECT   1   FROM   sysobjects   where   xtype='PK'   and   name   in   (  
                              SELECT   name   FROM   sysindexes   WHERE   indid   in(  
                              SELECT   indid   FROM   sysindexkeys   WHERE   id   =   a.id   AND   colid=a.colid  
                              )))   then   '√'   else   ''   end,  
                              类型=b.name,  
                              占用字节数=a.length,  
                              长度=COLUMNPROPERTY(a.id,a.name,'PRECISION'),  
                              小数位数=isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0),  
                              允许空=case   when   a.isnullable=1   then   '√'else   ''   end,  
                              默认值=isnull(e.text,''),  
                              字段说明=isnull(g.[value],'')  
                              FROM   syscolumns   a  
                              left   join   systypes   b   on   a.xusertype=b.xusertype  
                              inner   join   sysobjects   d   on   a.id=d.id     and   d.xtype='U'   and     d.name<>'dtproperties'  
                              left   join   syscomments   e   on   a.cdefault=e.id  
                              left   join   sysproperties   g   on   a.id=g.id   and   a.colid=g.smallid      
                              left   join   sysproperties   f   on   d.id=f.id   and   f.smallid=0  
                              where   d.name='NET_Department'         --如果只查询指定表,加上此条件  
                              order   by   a.id,a.colorder


    显示每个表当前有多少行

    SELECT TOP 100 Percent sysobjects.name,sysindexes.rows
    FROM sysindexes with(nolock)
    JOIN sysobjects with(nolock) ON sysindexes.id = sysobjects.id AND sysobjects.xtype = 'u'
    WHERE sysindexes.indid in(0, 1)
    ORDER By sysobjects.name ASC
    -------------------------------------------------------------------------------------------------------------------
    SELECT               ---2005
        TableName=CASE WHEN C.column_id=1 THEN O.name ELSE N'' END,   
        Column_id=C.column_id,
        ColumnName=C.name,    
        Type=T.name,
        Length=C.max_length,
        Precision=C.precision,
        Scale=C.scale,
        NullAble=CASE WHEN C.is_nullable=1 THEN N'√'ELSE N'' END,
        [Default]=ISNULL(D.definition,N''),
        ColumnDesc=ISNULL(PFD.[value],N''),
        Create_Date=O.Create_Date,
        Modify_Date=O.Modify_date
    FROM sys.columns C
        INNER JOIN sys.objects O
            ON C.[object_id]=O.[object_id]
                AND O.type='U'
                AND O.is_ms_shipped=0
        INNER JOIN sys.types T
            ON C.user_type_id=T.user_type_id
        LEFT JOIN sys.default_constraints D
            ON C.[object_id]=D.parent_object_id
                AND C.column_id=D.parent_column_id
                AND C.default_object_id=D.[object_id]
        LEFT JOIN sys.extended_properties PFD
            ON PFD.class=1
                AND C.[object_id]=PFD.major_id
                AND C.column_id=PFD.minor_id
        LEFT JOIN sys.extended_properties PTB
            ON PTB.class=1
                AND PTB.minor_id=0
                AND C.[object_id]=PTB.major_id
    --where O.name='GoToneCustomService'  -- 要查询的表名   如果不加默认是该库底下的所有表

    ---------------------------------------------------------------------------------------------------------------------------
    4.如何得到服务器的IP地址
    create table #ip(id int identity(1,1),re varchar(200))
    declare @s varchar(1000)
    set @s='ping '+left(@@servername,charindex('\',@@servername+'\')-1)+' -a -n 1 -l 1'
    insert #ip(re) exec master..xp_cmdshell @s
    select 服务器名=@@servername,IP地址=stuff(left(re,charindex(']',re)-1),1,charindex('[',re),'')
    from #ip
    where id=2
    drop table #ip


    ---------------------------------------------------------------------------------------------------------------------------
    9.如何知道哪些触发器被禁用?
    --将trigger 在sysobjects 表中 status字段的值转换为二进制的,第12位为1则表示禁止,为0表示允许

    select 表名=object_name(parent_obj),触发器名=name
     ,状态=case status & power(2,11) when 0 then N'启用' else N'禁用' end
    from sysobjects  where type='TR'

    ---------------------------------------------------------------------------------------------------------------------------
    select j.name as jobName,step_id,s.step_name,command,database_name from sysjobs j
    right outer join sysjobsteps s
    on j.job_id= s.job_id
    --where subsystem ='tsql'
    order by j.job_id,s.step_id


    ---------------------------------------------------------------------------------------------------------------------------
                                     作业
    SELECT 作业的名称 = name,
           对作业的说明 = description,
           计划运行作业的下一个日期 = (SELECT top 1   left(left(next_run_date,4)+'-'+right(next_run_date,4),7)+'-'+right(next_run_date,2)
                           FROM   msdb.dbo.sysjobschedules
                           WHERE  job_id = sysjobs.job_id),
           计划运行作业的时间 = (SELECT top 1   left(left(left('000000',6-len(next_run_time))+ltrim(next_run_time),2)+':'+right(left('000000',6-len(next_run_time))+ltrim(next_run_time),4),5)+':'+right(left('000000',6-len(next_run_time))+ltrim(next_run_time),2)
                        FROM   msdb.dbo.sysjobschedules
                        WHERE  job_id = sysjobs.job_id),
           作业的执行状态 = CASE (SELECT   top 1   run_status
                           FROM     msdb.dbo.sysjobhistory
                           WHERE    job_id = sysjobs.job_id
                           ORDER BY instance_id DESC)
                       WHEN 0 THEN '失败'
                       WHEN 1 THEN '成功'
                       WHEN 2 THEN '重试'
                       WHEN 3 THEN '已取消'
                       WHEN 4 THEN '正在进行中'
                     END,
           作业或步骤开始执行的日期 = (SELECT   top 1   left(left(run_date,4)+'-'+right(run_date,4),7)+'-'+right(run_date,2)
                           FROM     msdb.dbo.sysjobhistory
                           WHERE    job_id = sysjobs.job_id
                           ORDER BY instance_id DESC),
           作业或步骤开始的时间 = (SELECT   top 1   left(left(left('000000',6-len(run_time))+ltrim(run_time),2)+':'+right(left('000000',6-len(run_time))+ltrim(run_time),4),5)+':'+right(left('000000',6-len(run_time))+ltrim(run_time),2)
                         FROM     msdb.dbo.sysjobhistory
                         WHERE    job_id = sysjobs.job_id
                         ORDER BY instance_id DESC),
           执行作业或步骤所花费的时间 = (SELECT   top 1  left(left(left('000000',6-len(run_duration))+ltrim(run_duration),2)+'小时'+right(left('000000',6-len(run_duration))+ltrim(run_duration),4),5)+'分钟'+right(left('000000',6-len(run_duration))+ltrim(run_duration),2)+'秒'
                            FROM     msdb.dbo.sysjobhistory
                            WHERE    job_id = sysjobs.job_id
                            ORDER BY instance_id DESC)
    FROM   msdb.dbo.sysjobs

    ---------------------------------------------------------------------------------------------------------------------------
     SQL server 中的作业信息查询    
    作业信息存储在MSDB中.可以运行以下存储过程,监视作业的执行情况.

    可以参考如下SQL:

    SELECT 作业的名称 = name,
           对作业的说明 = description,
           计划运行作业的下一个日期 = (SELECT next_run_date
                           FROM   sysjobschedules
                           WHERE  job_id = sysjobs.job_id),
           计划运行作业的时间 = (SELECT next_run_time
                        FROM   sysjobschedules
                        WHERE  job_id = sysjobs.job_id),
           作业的执行状态 = CASE (SELECT   top 1   run_status
                           FROM     sysjobhistory
                           WHERE    job_id = sysjobs.job_id
                           ORDER BY instance_id DESC)
                       WHEN 0 THEN '失败'
                       WHEN 1 THEN '成功'
                       WHEN 2 THEN '重试'
                       WHEN 3 THEN '已取消'
                       WHEN 4 THEN '正在进行中'
                     END,
           作业或步骤开始执行的日期 = (SELECT   top 1   run_date
                           FROM     sysjobhistory
                           WHERE    job_id = sysjobs.job_id
                           ORDER BY instance_id DESC),
           作业或步骤开始的时间 = (SELECT   top 1   run_time
                         FROM     sysjobhistory
                         WHERE    job_id = sysjobs.job_id
                         ORDER BY instance_id DESC),
           执行作业或步骤所花费的时间 = (SELECT   top 1   run_duration
                            FROM     sysjobhistory
                            WHERE    job_id = sysjobs.job_id
                            ORDER BY instance_id DESC)
    FROM   sysjobs

     如果监视备份作业的执行计划,可以在描述中输入:"备份" 等字样,查询时候可以用description 描述信息过滤.如下:

    (注意:对某些字段尽心了翻译和转换)

    SELECT 作业的名称 = name,
           对作业的说明 = description,
           计划运行作业的下一个日期 = (SELECT left(left(next_run_date,4)+'-'+right(next_run_date,4),7)+'-'+right(next_run_date,2)
                           FROM   sysjobschedules
                           WHERE  job_id = sysjobs.job_id),
           计划运行作业的时间 = (SELECT left(left(left('000000',6-len(next_run_time))+ltrim(next_run_time),2)+':'+right(left('000000',6-len(next_run_time))+ltrim(next_run_time),4),5)+':'+right(left('000000',6-len(next_run_time))+ltrim(next_run_time),2)
                        FROM   sysjobschedules
                        WHERE  job_id = sysjobs.job_id),
           作业的执行状态 = CASE (SELECT   top 1   run_status
                           FROM     sysjobhistory
                           WHERE    job_id = sysjobs.job_id
                           ORDER BY instance_id DESC)
                       WHEN 0 THEN '失败'
                       WHEN 1 THEN '成功'
                       WHEN 2 THEN '重试'
                       WHEN 3 THEN '已取消'
                       WHEN 4 THEN '正在进行中'
                     END,
           作业或步骤开始执行的日期 = (SELECT   top 1   left(left(run_date,4)+'-'+right(run_date,4),7)+'-'+right(run_date,2)
                           FROM     sysjobhistory
                           WHERE    job_id = sysjobs.job_id
                           ORDER BY instance_id DESC),
           作业或步骤开始的时间 = (SELECT   top 1   left(left(left('000000',6-len(run_time))+ltrim(run_time),2)+':'+right(left('000000',6-len(run_time))+ltrim(run_time),4),5)+':'+right(left('000000',6-len(run_time))+ltrim(run_time),2)
                         FROM     sysjobhistory
                         WHERE    job_id = sysjobs.job_id
                         ORDER BY instance_id DESC),
           执行作业或步骤所花费的时间 = (SELECT   top 1  left(left(left('000000',6-len(run_duration))+ltrim(run_duration),2)+'小时'+right(left('000000',6-len(run_duration))+ltrim(run_duration),4),5)+'分钟'+right(left('000000',6-len(run_duration))+ltrim(run_duration),2)+'秒'
                            FROM     sysjobhistory
                            WHERE    job_id = sysjobs.job_id
                            ORDER BY instance_id DESC)
    FROM   sysjobs
    WHERE description LIKE '%备份%'

    这样就可以监视到备份数据库计划的执行,前台页面就可以用Ajax来无刷新监视备份情况了.

    测试后,SQL server 2005 也使用.

  • 一些有用的sqlserver命令

    2010-03-15 10:57:04

    --查询当前该实例下所有数据库
    select * from master.dbo.sysdatabases

    -- 查询当前系统服务器
    select * from master.dbo.sysservers

    --显示该库下所建立的所有表
    SELECT table_name FROM INFORMATION_SCHEMA.TABLES 

    --显示所有用户表
    select * from sysobjects where xtype='u'

  • 附加数据库出错的处理方法!

    2010-03-15 10:54:56

    执行下列语句:EXEC  sp_configure  'allow  updates',1    RECONFIGURE  WITH  OVERRIDE   
    update sysdatabases set  status  =  32768  where  name  =  '数据库名' 
    DBCC  REBUILD_LOG  ('数据库名',  'E: dzzdatabase dzz1204_Log.LDF'  ) 
    update sysdatabases set  status  =  0  where  name  =  '数据库名' 
    restore  database  数据库名  WITH  RECOVERY 
    EXEC  sp_configure  'allow  updates',0    RECONFIGURE  WITH  OVERRIDE  

  • SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' ..而被关闭

    2010-03-15 09:25:17

    在Sql Server中查询一下Excel文件的时候出现问题:
    SELECT *  FROM OPENROWSET( 'MICROSOFT.JET.OLEDB.4.0','Excel
    8.0;IMEX=1;HDR=YES;DATABASE=D:\a.xls',[sheet1$])
    结果提示:
        SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的
    STATEMENT'OpenRowset/OpenDatasource' 的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。系统管理员可以通过使用 sp_configure 启用 'Ad Hoc Distributed Queries'。有关启用 'Ad Hoc Distributed Queries' 的详细信息,请参阅 SQL Server 联机丛书中的 "外围应用配置器"。
    查询相关资料,找到解决方法:

    --启用Ad Hoc Distributed Queries:
    exec sp_configure 'show advanced options',1
    reconfigure
    exec sp_configure 'Ad Hoc Distributed Queries',1
    reconfigure


    --使用完成后,关闭Ad Hoc Distributed Queries:
    exec sp_configure 'Ad Hoc Distributed Queries',0
    reconfigure
    exec sp_configure 'show advanced options',0
    reconfigure

  • 跨数据库查询

    2010-03-15 09:11:09

    sp_addlinkedserver
    创建一个链接的服务器,使其允许对分布式的、针对 OLE DB 数据源的异类查询进行访问。在使用 sp_addlinkedserver 创建链接的服务器之后,此服务器就可以执行分布式查询。如果链接服务器定义为 Microsoft® SQL Server™,则可执行远程存储过程。

    语法
    sp_addlinkedserver [ @server = ] 'server'
    [ , [ @srvproduct = ] 'product_name' ]
    [ , [ @provider = ] 'provider_name' ]
    [ , [ @datasrc = ] 'data_source' ]
    [ , [ @location = ] 'location' ]
    [ , [ @provstr = ] 'provider_string' ]
    [ , [ @catalog = ] 'catalog' ]
    语法
    sp_addlinkedsrvlogin [ @rmtsrvname = ] 'rmtsrvname'
    [ , [ @useself = ] 'useself' ]
    [ , [ @locallogin = ] 'locallogin' ]
    [ , [ @rmtuser = ] 'rmtuser' ]
    [ , [ @rmtpassword = ] 'rmtpassword' ]


    [@useself =] 'useself'

    决定用于连接到远程服务器的登录名称。useself 的数据类型为 varchar(8),默认设置为 TRUE。true 值指定 SQL Server 验证的登录使用其自己的凭据以连接到 rmtsrvname,而忽略 rmtuser 和 rmtpassword 参数。false 值指定 rmtuser 和 rmtpassword 参数用来连接到特定 locallogin 的 rmtsrvname。如果 rmtuser 和 rmtpassword 也设置为 NULL,则连接链接服务器不需使用任何登录或密码。对于 Windows NT 身份验证登录而言,useself 为 true 则无效,除非 Microsoft Windows NT&reg; 环境支持安全帐户委托,并且,提供程序支持 Windows 身份验证(此时不再需要创建值为 true 的映射,不过创建仍然有效)。

    [ @locallogin =] 'locallogin'

    本地服务器上的登录。locallogin 的数据类型为 sysname,默认设置为 NULL。NULL 值指定此条目将应用于所有连接到 rmtsrvname 的本地登录。如果值不为 NULL,则 locallogin 可以是一个 SQL Server 登录或 Windows NT 用户。必须授予 Windows NT 用户直接访问 SQL Server 或通过其作为已授予访问权限的组的成员来访问 SQL Server 的权限。  
    不同服务器数据库之间的数据操作

    --创建链接服务器
    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 ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)

    --把本地表导入远程表
    insert openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)
    select * from 本地表

    --更新本地表
    update b
    set b.列A=a.列A
    from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)as a inner join 本地表 b
    on a.column1=b.column1

    --openquery用法需要创建一个连接

    --首先创建一个连接创建链接服务器
    exec sp_addlinkedserver 'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 '
    --查询
    select * FROM  openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ')
    --把本地表导入远程表
    insert openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ')
    select * from 本地表
    --更新本地表
    update b
    set b.列B=a.列B
    FROM  openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ') as a
    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.表名
  • openrowset 的用法

    2010-03-15 08:53:51

    利用openrowset发送本地命令。通常我们的用法是(包括MSDN的列子)如下: 

      select * from openrowset('sqloledb','myserver';'sa';'','select * from table') 

      可见(即使从字面意义上看)openrowset只是作为一个快捷的远程数据库访问,它必须跟在select后面,也就是说需要返回一个recordset 。 

      那么我们能不能利用它调用xp_cmdshell呢?答案是肯定的! 

      select * from openrowset('sqloledb','server';'sa';'','set fmtonly off 

      exec master.dbo.xp_cmdshel l ''dir c:\''') 

      必须加上set fmtonly off用来屏蔽默认的只返回列信息的设置,这样xp_cmdshell返回的output集合就会提交给前面的select显示,如果采用默认设置,会返回空集合导致select出错,命令也就无法执行了。 

      那么如果我们要调用sp_addlogin呢,他不会像xp_cmdshell返回任何集合的,我们就不能再依靠fmtonly设置了,可以如下操作: 

      select * from openrowset('sqloledb','server';'sa';'','select ''OK!'' 

      exec master.dbo.sp_addlogin Hectic') 

        这样,命令至少会返回select OK!'的集合,你的机器商会显示OK!,同时对方的数据库内也会增加一个Hectic的账号,也就是说,我们利用select 'OK!'的返回集合欺骗了本地的select请求,是命令能够正常执行,通理sp_addsrvrolemember和opendatasource也可以如此操作!至于这个方法真正的用处,大家慢慢想吧。 

    示例
    A. 将 OPENROWSET 与 SELECT 语句及用于 SQL Server 的 Microsoft OLE DB 提供程序一起使用

    下面的示例使用用于 SQL Server 的 Microsoft OLE DB 提供程序访问 pubs 数据库中的 authors 表,该数据库在一个名为 seattle1 的远程服务器上。从 datasourceuser_idpassword 中初始化提供程序,并且使用 SELECT 语句定义返回的行集。

    USE pubs
    GO
    SELECT a.*
    FROM OPENROWSET('SQLOLEDB','seattle1';'sa';'MyPass',
       'SELECT * FROM pubs.dbo.authors ORDER BY au_lname, au_fname') AS a
    GO
    
    B. 将 OPENROWSET 与对象及用于 ODBC 的 OLE DB 提供程序一起使用

    下面的示例使用用于 ODBC 的 OLE DB 提供程序以及 SQL Server ODBC 驱动程序访问 pubs 数据库中的 authors 表,该数据库在一个名为 seattle1 的远程服务器中。提供程序用在 ODBC 提供程序所用的 ODBC 语法中指定的 provider_string 进行初始化,定义返回的行集时使用 catalog.schema.object 语法。

    USE pubs
    GO
    SELECT a.*
    FROM OPENROWSET('MSDASQL',
       'DRIVER={SQL Server};SERVER=seattle1;UID=sa;PWD=MyPass',
       pubs.dbo.authors) AS a
    ORDER BY a.au_lname, a.au_fname
    GO
    
    C. 使用用于 Jet 的 Microsoft OLE DB 提供程序

    下面的示例通过用于 Jet 的 Microsoft OLE DB 提供程序访问 Microsoft Access Northwind 数据库中的 orders 表。

    说明  下面的示例假定已经安装了 Access。

    USE pubs
    GO
    SELECT a.*
    FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 
       'c:\MSOffice\Access\Samples\northwind.mdb';'admin';'mypwd', Orders) 
       AS a
    GO
    
    D. 使用 OPENROWSET 和 INNER JOIN 中的另一个表

    下面的示例从本地 SQL Server Northwind 数据库的 customers 表中,以及存储在相同计算机上 Access Northwind 数据库的 orders 表中选择所有数据

    说明  下面的示例假定已经安装了 Access。

    USE pubs
    GO
    SELECT c.*, o.*
    FROM Northwind.dbo.Customers AS c INNER JOIN 
       OPENROWSET('Microsoft.Jet.OLEDB.4.0', 
       'c:\MSOffice\Access\Samples\northwind.mdb';'admin';'mypwd', Orders) 
       AS o
       ON c.CustomerID = o.CustomerID 
    GO
    
  • SQLSERVER2000中实现跨库查询

    2010-03-14 22:13:36

    SQLSERVER2000中实现跨库查询

    select * from dataservername.databasename.dbo.tablename

  • 数据库备份与还原处理(转载!)

    2009-12-15 17:35:24

    利用T-SQL语句,实现数据库的备份与还原的功能

    体现了SQL Server中的四个知识点:

     

    1.   获取SQL Server服务器上的默认目录

     

    2.   备份SQL语句的使用

     

    3.   恢复SQL语句的使用,同时考虑了强制恢复时关闭其他用户进程的处理

     

    4.   作业创建SQL语句的使用

     

     

    /*1.--得到数据库的文件目录
     
     @dbname 指定要取得目录的数据库名
       如果指定的数据不存在,返回安装SQL时设置的默认数据目录
       如果指定NULL,则返回默认的SQL备份目录名
    --邹建 2003.10(引用请保留此信息)--*/

    /*--调用示例
     select 数据库文件目录=dbo.f_getdbpath('tempdb')
      ,[默认SQL SERVER数据目录]=dbo.f_getdbpath('')
      ,[默认SQL SERVER备份目录]=dbo.f_getdbpath(null)
    --*/
    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_getdbpath]') and xtype in (N'FN', N'IF', N'TF'))
    drop function [dbo].[f_getdbpath]
    GO

    create function f_getdbpath(@dbname sysname)
    returns nvarchar(260)
    as
    begin
     declare @re nvarchar(260)
     if @dbname is null or db_id(@dbname) is null
      select @re=rtrim(reverse(filename)) from master..sysdatabases where name='master'
     else
      select @re=rtrim(reverse(filename)) from master..sysdatabases where name=@dbname

     if @dbname is null
      set @re=reverse(substring(@re,charindex('\',@re)+5,260))+'BACKUP'
     else
      set @re=reverse(substring(@re,charindex('\',@re),260))
     return(@re)
    end
    go

     

    /*2.--备份数据库

    --邹建 2003.10(引用时请保留此信息)--*/

    /*--调用示例

    --备份当前数据库
    exec p_backupdb @bkpath='c:\',@bkfname='db_\DATE\_db.bak'

    --差异备份当前数据库
    exec p_backupdb @bkpath='c:\',@bkfname='db_\DATE\_df.bak',@bktype='DF'

    --备份当前数据库日志
    exec p_backupdb @bkpath='c:\',@bkfname='db_\DATE\_log.bak',@bktype='LOG'

    --*/

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_backupdb]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
    drop procedure [dbo].[p_backupdb]
    GO

    create proc p_backupdb
    @dbname sysname='',   --要备份的数据库名称,不指定则备份当前数据库
    @bkpath nvarchar(260)='', --备份文件的存放目录,不指定则使用SQL默认的备份目录
    @bkfname nvarchar(260)='', --备份文件名,文件名中可以用\DBNAME\代表数据库名,\DATE\代表日期,\TIME\代表时间
    @bktype nvarchar(10)='DB', --备份类型:'DB'备份数据库,'DF' 差异备份,'LOG' 日志备份
    @appendfile bit=1   --追加/覆盖备份文件
    as
     declare @sql varchar(8000)
     if isnull(@dbname,'')='' set @dbname=db_name()
     if isnull(@bkpath,'')='' set @bkpath=dbo.f_getdbpath(null)
     if isnull(@bkfname,'')='' set @bkfname='\DBNAME\_\DATE\_\TIME\.BAK'
     set @bkfname=replace(replace(replace(@bkfname,'\DBNAME\',@dbname)
      ,'\DATE\',convert(varchar,getdate(),112))
      ,'\TIME\',replace(convert(varchar,getdate(),108),':',''))
     set @sql='backup '+case @bktype when 'LOG' then 'log ' else 'database ' end +@dbname
      +' to disk='''+@bkpath+@bkfname
      +''' with '+case @bktype when 'DF' then 'DIFFERENTIAL,' else '' end
      +case @appendfile when 1 then 'NOINIT' else 'INIT' end
     print @sql
     exec(@sql)
    go

    /*3.--恢复数据库

    --邹建 2003.10(引用时请保留此信息)--*/

    /*--调用示例
    --完整恢复数据库
    exec p_RestoreDb @bkfile='c:\db_20031015_db.bak',@dbname='db'

    --差异备份恢复
    exec p_RestoreDb @bkfile='c:\db_20031015_db.bak',@dbname='db',@retype='DBNOR'
    exec p_backupdb @bkfile='c:\db_20031015_df.bak',@dbname='db',@retype='DF'

    --日志备份恢复
    exec p_RestoreDb @bkfile='c:\db_20031015_db.bak',@dbname='db',@retype='DBNOR'
    exec p_backupdb @bkfile='c:\db_20031015_log.bak',@dbname='db',@retype='LOG'

    --*/

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_RestoreDb]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
    drop procedure [dbo].[p_RestoreDb]
    GO

    create proc p_RestoreDb
    @bkfile nvarchar(1000),  --定义要恢复的备份文件名
    @dbname sysname='',      --定义恢复后的数据库名,默认为备份的文件名
    @dbpath nvarchar(260)='', --恢复后的数据库存放目录,不指定则为SQL的默认数据目录
    @retype nvarchar(10)='DB', --恢复类型:'DB'完事恢复数据库,'DBNOR' 为差异恢复,日志恢复进行完整恢复,'DF' 差异备份的恢复,'LOG' 日志恢复
    @filenumber int=1,   --恢复的文件号
    @overexist bit=1,        --是否覆盖已经存在的数据库,仅@retype为
    @killuser bit=1       --是否关闭用户使用进程,仅@overexist=1时有效
    as
    declare @sql varchar(8000)

    --得到恢复后的数据库名
    if isnull(@dbname,'')=''
     select @sql=reverse(@bkfile)
      ,@sql=case when charindex('.',@sql)=0 then @sql
       else substring(@sql,charindex('.',@sql)+1,1000) end
      ,@sql=case when charindex('\',@sql)=0 then @sql
       else left(@sql,charindex('\',@sql)-1) end
      ,@dbname=reverse(@sql)

    --得到恢复后的数据库存放目录
    if isnull(@dbpath,'')='' set @dbpath=dbo.f_getdbpath('')

    --生成数据库恢复语句
    set @sql='restore '+case @retype when 'LOG' then 'log ' else 'database ' end+@dbname
     +' from disk='''+@bkfile+''''
     +' with file='+cast(@filenumber as varchar)
     +case when @overexist=1 and @retype in('DB','DBNOR') then ',replace' else '' end
     +case @retype when 'DBNOR' then ',NORECOVERY' else ',RECOVERY' end
    print @sql
    --添加移动逻辑文件的处理
    if @retype='DB' or @retype='DBNOR'
    begin
     --从备份文件中获取逻辑文件名
     declare @lfn nvarchar(128),@tp char(1),@i int

     --创建临时表,保存获取的信息
     create table #tb(ln nvarchar(128),pn nvarchar(260),tp char(1),fgn nvarchar(128),sz numeric(20,0),Msz numeric(20,0))
     --从备份文件中获取信息
     insert into #tb exec('restore filelistonly from disk='''+@bkfile+'''')
     declare #f cursor for select ln,tp from #tb
     open #f
     fetch next from #f into @lfn,@tp
     set @i=0
     while @@fetch_status=0
     begin
      select @sql=@sql+',move '''+@lfn+''' to '''+@dbpath+@dbname+cast(@i as varchar)
       +case @tp when 'D' then '.mdf''' else '.ldf''' end
       ,@i=@i+1
      fetch next from #f into @lfn,@tp
     end
     close #f
     deallocate #f
    end

    --关闭用户进程处理
    if @overexist=1 and @killuser=1
    begin
     declare @spid varchar(20)
     declare #spid cursor for
      select spid=cast(spid as varchar(20)) from master..sysprocesses where dbid=db_id(@dbname)
     open #spid
     fetch next from #spid into @spid
     while @@fetch_status=0
     begin 
      exec('kill '+@spid)
      fetch next from #spid into @spid
     end 
     close #spid
     deallocate #spid
    end

    --恢复数据库
    exec(@sql)

    go

    /*4.--创建作业

    --邹建 2003.10(引用时请保留此信息)--*/

    /*--调用示例

    --每月执行的作业
    exec p_createjob @jobname='mm',@sql='select * from syscolumns',@freqtype='month'

    --每周执行的作业
    exec p_createjob @jobname='ww',@sql='select * from syscolumns',@freqtype='week'

    --每日执行的作业
    exec p_createjob @jobname='a',@sql='select * from syscolumns'

    --每日执行的作业,每天隔4小时重复的作业
    exec p_createjob @jobname='b',@sql='select * from syscolumns',@fsinterval=4

    --*/
    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),   --要执行的命令
    @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
         when 'week' then 8
         when 'month' then 16 end
     ,@fstype=case @fsinterval when 1 then 0 else 8 end
    if @fsinterval<>1 set @time=0
    set @ffactor=case @freqtype when 'day' then 0 else 1 end

    EXEC msdb..sp_add_jobschedule @job_name=@jobname,
     @name = '时间安排',
     @freq_type=@ftype ,      --每天,8 每周,16 每月
     @freq_interval=1,     --重复执行次数
     @freq_subday_type=@fstype,   --是否重复执行
     @freq_subday_interval=@fsinterval,  --重复周期
     @freq_recurrence_factor=@ffactor,
     @active_start_time=@time     --下午17:00:00分执行

    go


    /*--应用案例--备份方案:
    完整备份(每个星期天一次)+差异备份(每天备份一次)+日志备份(每2小时备份一次)

    调用上面的存储过程来实现
    --*/

    declare @sql varchar(8000)
    --完整备份(每个星期天一次)
    set @sql='exec p_backupdb @dbname=''要备份的数据库名'''
    exec p_createjob @jobname='每周备份',@sql,@freqtype='week'

    --差异备份(每天备份一次)
    set @sql='exec p_backupdb @dbname=''要备份的数据库名'',@bktype='DF''
    exec p_createjob @jobname='每天差异备份',@sql,@freqtype='day'

    --日志备份(每2小时备份一次)
    set @sql='exec p_backupdb @dbname=''要备份的数据库名'',@bktype='LOG''
    exec p_createjob @jobname='每2小时日志备份',@sql,@freqtype='day',@fsinterval=2

    /*--应用案例2

    生产数据核心库:PRODUCE

    备份方案如下:
     1.设置三个作业,分别对PRODUCE库进行每日备份,每周备份,每月备份
     2.新建三个新库,分别命名为:每日备份,每周备份,每月备份
     3.建立三个作业,分别把三个备份库还原到以上的三个新库。

    目的:当用户在produce库中有任何的数据丢失时,均可以从上面的三个备份库中导入相应的TABLE数据。
    --*/

    declare @sql varchar(8000)

    --1.建立每月备份和生成月备份数据库的作业,每月每1天下午16:40分进行:
    set @sql='
    declare @path nvarchar(260),@fname nvarchar(100)
    set @fname=''PRODUCE_''+convert(varchar(10),getdate(),112)+''_m.bak''
    set @path=dbo.f_getdbpath(null)+@fname

    --备份
    exec p_backupdb @dbname=''PRODUCE'',@bkfname=@fname

    --根据备份生成每月新库
    exec p_RestoreDb @bkfile=@path,@dbname=''PRODUCE_月''

    --为周数据库恢复准备基础数据库
    exec p_RestoreDb @bkfile=@path,@dbname=''PRODUCE_周'',@retype=''DBNOR''

    --为日数据库恢复准备基础数据库
    exec p_RestoreDb @bkfile=@path,@dbname=''PRODUCE_日'',@retype=''DBNOR''
    '
    exec p_createjob @jobname='每月备份',@sql,@freqtype='month',@time=164000

    --2.建立每周差异备份和生成周备份数据库的作业,每周日下午17:00分进行:
    set @sql='
    declare @path nvarchar(260),@fname nvarchar(100)
    set @fname=''PRODUCE_''+convert(varchar(10),getdate(),112)+''_w.bak''
    set @path=dbo.f_getdbpath(null)+@fname

    --差异备份
    exec p_backupdb @dbname=''PRODUCE'',@bkfname=@fname,@bktype=''DF''

    --差异恢复周数据库
    exec p_backupdb @bkfile=@path,@dbname=''PRODUCE_周'',@retype=''DF''
    '
    exec p_createjob @jobname='每周差异备份',@sql,@freqtype='week',@time=170000

    --3.建立每日日志备份和生成日备份数据库的作业,每周日下午17:15分进行:
    set @sql='
    declare @path nvarchar(260),@fname nvarchar(100)
    set @fname=''PRODUCE_''+convert(varchar(10),getdate(),112)+''_l.bak''
    set @path=dbo.f_getdbpath(null)+@fname

    --日志备份
    exec p_backupdb @dbname=''PRODUCE'',@bkfname=@fname,@bktype=''LOG''

    --日志恢复日数据库
    exec p_backupdb @bkfile=@path,@dbname=''PRODUCE_日'',@retype=''LOG''
    '
    exec p_createjob @jobname='每周差异备份',@sql,@freqtype='day',@time=171500


    更多的信息参考我在CSDN上发表的贴子:

    http://expert.csdn.net/Expert/topic/2359/2359124.xml?temp=.7861292

     

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zjcxc/archive/2003/12/29/20074.aspx

  • SQL Server 2005:找出数据库(SQL Server 实例上的所有数据库)中包含特定列的所有表

    2009-12-15 17:33:26

    SQL Server 2005:找出数据库(SQL Server 实例上的所有数据库)中包含特定列的所有表

    use master
    go
    
    --------------------------------------------------------------------------------
    -- author : p.c.w.l
    -- source : www.sqlstudy.com
    -- create : 2008-01-01
    -- descr  : 找出数据库(SQL Server 实例上的所有数据库)中包含特定列的所有表
    --------------------------------------------------------------------------------
    
    -- example:
    --
    -- exec sp_column_in_tables 'OrderID'
    -- exec sp_column_in_tables 'OrderID', 'Northwind'
    -- exec sp_column_in_tables 'Order%' , 'Northwind'
    
    create procedure dbo.sp_column_in_tables
    (
       @column_name   nvarchar(255)
      ,@db_name       nvarchar(50) = null
    )
    as
    begin
       set nocount on
    
       create table #tables(
          db_name      nvarchar(50)  not null
         ,table_name   nvarchar(255) not null
         ,column_name  nvarchar(255) not null
       )
    
       declare @sql nvarchar(500)
       set @sql = N'use ? insert into #tables
                    select ''?'', object_name(object_id), name
                     from sys.columns where name like ''' +  @column_name + N'''' +
                    N' and objectproperty(object_id, ''IsUserTable'')=1'
    
       if len(@db_name) > 0 begin
          set @sql = replace(@sql, '?', @db_name)
          execute(@sql)
       end else begin
          exec sp_MSforeachdb @sql
       end
    
       -- print @sql
    
       select * from #tables
        where db_name not in('master', 'msdb', 'model', 'tempdb')
        order by db_name, table_name
    
       drop table #tables
    end
    go
    
  • 如何手动卸载 SQL Server 2005 的独立实例!

    2009-12-15 17:16:57

    如何手动卸载 SQL Server 2005 的独立实例

    警告:注册表编辑器或其他方法使用不当可能导致严重问题。这些问题可能需要重新安装操作系统才能解决。Microsoft 不能保证您可以解决这些问题。修改注册表需要您自担风险。

    步骤 1:确保 Microsoft SQL Server 安装支持文件组件已安装


    如果“Microsoft SQL Server 安装支持文件”没有出现在该列表中,请先安装该组件,然后再继续。要安装该组件,请按照下列步骤操作:
    1. 找到原始的 SQL Server 2005 安装介质。
    2. 要安装支持文件,请双击“Servers\setup\sqlsupport.msi”文件。
    注意:在“步骤 5:卸载 Microsoft SQL Server 安装支持文件组件”一节中,将卸载该组件。

    步骤 2:运行命令以卸载 SQL Server 组件

    "%ProgramFiles%\Microsoft SQL Server\90\Setup Bootstrap\ARPWrapper.exe /Remove"
    一次卸载一个 SQL Server 组件,直到所有 SQL Server 组件都卸载。

    注意:“添加或删除程序”还会使用“/Remove”选项运行 ARPWrapper.exe 程序。但是,对 ARPWrapper.exe 程序的引用可能已删除。

    如果您已卸载 SQL Server Reporting Services,则必须执行下列任务:
    • 删除 Reporting Services 虚拟目录
    • ReportServer[$InstanceName
    • Reports[$InstanceName
  • 删除 ReportServer 应用程序池
如果收到以下错误消息,请转到“如果遇到问题”一节,以卸载 SQL Server 重分发文件和 SQL Server 支持文件:
Registry Enumeration Failed
某个实例可能具有多个服务器。例如,某个实例可能具有 SQL Server 2005 数据库引擎、SQL Server 2005 Analysis Services 和 SQL Server 2005 Reporting Services。如果某个实例具有多个服务器,安装程序将失败,并且您将收到以下错误消息:
The setup has encountered an unexpected error in datastore.The action is RestoreSetupParams.
该错误是由 refcounting 引起的。Refcount 用于跟踪使用同一 .dll 文件或同一 .msi 文件的程序的数量。卸载一个程序后,refcount 中使用 .msi 文件的程序将减少一个。卸载完最后一个程序后,.msi 文件将删除。在本例中,.msi 文件是 Microsoft SQL Server 安装支持文件组件 (SqlSupport.msi)。如果收到该错误消息,请使用下列方法之一来纠正此错误:
  • 在卸载实例中的各个组件之前,先重新安装 Microsoft SQL Server 安装支持文件组件 (SqlSupport.msi)。
  • 临时将 SqlSupport.msi 文件 refcount 为自身。为此,请按照下列步骤操作:
    1. 获取 Microsoft SQL Server 安装支持文件组件的 GUID。要获取 GUID,请按照“如果遇到问题”一节中的步骤 1 和 2 操作。
    2. 使用注册表编辑器创建或修改以下注册表项,使其具有下面指定的值:
      项名称:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\90\Bootstrap\MSIRefCount
      值:Uninstall
      类型:REG_SZ
      数据:{11111111-1111-1111-1111-111111111111},{GUID}
      注意GUID 是 SQL Server 支持文件的 GUID 的占位符。例如,英语 x86 SQL Server 支持文件的 GUID 为以下值:
      数据:{11111111-1111-1111-1111-111111111111},{53F5C3EE-05ED-4830-994B-50B2F0D50FCE}
如果遇到问题
  • 启动注册表编辑器,然后找到下面的注册表项:
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
  • 在左窗格中,单击每个 GUID。对于单击的每个 GUID,在右窗格中找到包含“Microsoft SQL Server 2005”的显示名称。例如,找到以下名称:
    • Microsoft SQL Server 2005
    • Microsoft SQL Server 2005 Analysis Services
    • Microsoft SQL Server 2005 Reporting Services
    • Microsoft SQL Server 2005 Notification Services
    • Microsoft SQL Server 2005 Integration Services
    • Microsoft SQL Server 2005 Tools
    • Microsoft SQL Server 2005 Books Online
    当看到包含“Microsoft SQL Server 2005”的显示名称时,记下在左窗格中单击的 GUID。
  • 对于在步骤 2 中记下的每个 GUID,在命令提示符处运行以下命令:
    start /wait msiexec /x {GUID} /l*v c:\sql_uninstall.log
    注意
    • 在该命令中,将 GUID 替换为您在步骤 2 中记下的 GUID。
    • 如果收到以下错误消息,请与 Microsoft 客户支持服务部门联系:
      The setup has encountered an unexpected error in datastore.
      要获取 Microsoft 产品支持服务的电话号码和支持费用信息的完整列表,请访问下面的 Microsoft 网站:
      http://support.microsoft.com/contactus/?ws=support (http://support.microsoft.com/contactus/?ws=support)
  • 打开下面的文件:
    C:\Sql_uninstall.log
    在距离该文件底部大约 15 行的位置处,找到类似以下内容的一行:
    MSI (s) (EC:F8) [12:52:18:007]:产品:Microsoft SQL Server 2005 Tools -- 成功地完成了删除。
    如果卸载过程失败,请记下该组件名称和 GUID,然后保存 Sql_uninstall.log 文件。
  • 步骤 3: 卸载支持组件

  • MSXML 6.0 Parser
  • SQLXML4
  • Microsoft SQL Server VSS Writer
  • Microsoft SQL Server 2005 Backward Compatibility
  • 与 SQL Server 2005 有关的任何组件,Microsoft SQL Server Native Client 组件和 Microsoft SQL Server 安装支持文件组件除外
  • 如果其中任一支持组件的卸载过程失败,可能会收到以下错误消息:
    Setup failed due to missing prerequisites
    如果收到此错误消息,请按照下列步骤操作:
    1. 启动注册表编辑器,然后找到下面的注册表项:
      HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
    2. 在左窗格中,单击每个 GUID。对于单击的每个 GUID,在右窗格中查找与可重分发文件名称相匹配的显示名称。当看到与重分发文件名称相匹配的显示名称时,记下在左窗格中单击的 GUID。
    3. 对于在步骤 2 中记下的每个 GUID,在命令提示符处运行以下命令:
      start /wait msiexec /x {GUID} SKIPREDISTPREREQS=1 /l*v c:\sqlredist_uninstall.log
      注意:在该命令中,将 GUID 替换为您在步骤 2 中记下的 GUID。
    4. 打开下面的文件:
      C:\Sqlredist_uninstall.log
      在该文件的底部,找到类似以下内容的一行:
      MSI (s) (EC:F8) [12:52:18:007]:产品:Microsoft SQL Server 2005 Backward compatibility -- 成功地完成了删除。
      如果卸载过程失败,请记下该组件名称和 GUID,然后保存 Sqlredist_uninstall.log 文件。

    步骤 4: 卸载 Microsoft SQL Server Native Client 组件


    注意:如果安装了 SQL Server 2000 组件,则不要卸载 Microsoft SQL Server Native Client 组件。

    步骤 5: 卸载 Microsoft SQL Server 安装支持文件组件

     

    如果这些步骤未能卸载所有组件

  • 执行“如何手动卸载 SQL Server 2005 的独立实例”部分中的步骤 1。
  • 在“添加或删除程序”中,按以下顺序卸载所有 SQL Server 2005 组件:
    • SQL Server 2005
    • SQL Server 2005 Analysis Services
    • SQL Server 2005 Reporting Services
    • SQL Server 2005 Notification Services
    • SQL Server 2005 Integration Services
    • SQL Server 2005 Tools
    • SQL Server 2005 联机图书
    • MSXML 6.0 Parser
    • SQLXML4
    • SQL Server VSS Writer
    • SQL Server 2005 Backward Compatibility
    • 与 SQL Server 2005 有关的任何其他内容
    • SQL Server Native Client
    • SQL Server 安装支持文件
  • 下载然后安装 Windows Installer 清理实用工具。 有关此实用工具的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
    290301  (http://support.microsoft.com/kb/290301/ ) Windows Installer 清理实用工具说明
  • 启动 Windows Installer 清理实用工具。
  • 如果列出了步骤 2 中的任何组件,请按照下列步骤操作:
    1. 选择这些组件,然后单击“删除”。可以使用 Ctrl 键选择多个组件。
    2. 当收到下面的警告消息时,请单击“确定”:
      将从 Windows Installer 数据库中删除所选的所有产品。要使产品能够正常工作,您必须分别重新安装所选的所有产品。
      注意:单击“确定”之前,请确保选择了正确的组件。单击“确定”后,这些组件将会永久删除。
    3. 在“添加或删除程序”中,卸载 Windows Installer 清理实用工具。
  •  

     

  • 远程备SQL2005份数据库 (转载!)

    2009-12-15 17:11:13

    远程备SQL2005份数据库

    今天终于把这个问题给解决了:

    参考文章:http://blog.csdn.net/long2006sky/archive/2007/04/23/1576583.aspx

    实例说明:

               环境:win2k+sqlserver 2K+查询分析器

               SQLSERVER服务实例名称:mainserver

               需要备份的数据库名称: msdb

               本地机器名称(Client端):david

               本地用户:zf 密码:123

               本地域名:domain

               本地提供备份需求的文件夹:e:\test

      第一步: 建立共享文件夹

         在程序代码中调用(或者CMD窗口)  net share test=e:\test

         或者用NetShareAdd这个API

         简要说明:

                net share     : 是WINDOWS内部的网络命令。

                                作用:建立本地的共享资源,显示当前计算机的共享资源信息。

                                语法:参见 net share /? 

      第二步: 建立共享信用关系

         master..xp_cmdshell 'net use  \\david\test 123 /user:domain\zf'

         简要说明:

               1:xp_cmdshell :是SQLSERVER的扩展存储过程。

                                作用,以操作系统命令行解释器的方式执行给定的命令字符串,

                                并以文本行方式返回任何输出。

                                语法:参见SQLSERVER联机帮助

               2:net use      : 是WINDOWS内部的网络命令。

                                作用,将计算机与共享资源连接或断开,或者显示关于计算机

                                连接的信息。该命令还控制持久网络连接。

                                语法:参见 net use /?

      第三步:备份数据库

         backup database msdb to disk='\\david\test\msdb.bak'

         这个不需要说明吧,语法参见SQLSERVER联机帮助

      第四步: 境蚕砦募?BR>     在程序代码中调用(或者CMD窗口)  net share test /delete

         或者用NetShareDel这个API

      结果:

          已处理 1376 页,这些页属于数据库 'msdb' 的文件 'MSDBData'(位于文件 1 上)。

          已处理 1 页,这些页属于数据库 'msdb' 的文件 'MSDBLog'(位于文件 1 上)。

          BACKUP DATABASE 操作成功地处理了 1377 页,花费了 3.653 秒(3.086 MB/秒)。

      这样mainserver服务器上的msdb就备份到了david机器的E:\test\msdb.bak文件了,使用起来很简单吧?恢复数据库操作也是一样,只要将第三个步骤的语句改为'restore database msdb from disk='\\david\test\msdb.bak'就可以啦。。你看完了也可以试试呀?!(最简单的测试工具查询分析器+CMD窗口)

    备注:xp_cmdshell 这个扩展存储过程只能SA级别的用户调用,而且是SQLSERVER的安全隐患之一,许多DBA都喜欢将其删除或者禁用,所以开发人员使用时要倍加小心哦。

         文章中的例子只是简要的说明了应如何利用扩展存储过程实现远程备份与恢复,没有涉及安全以及其他方面的考虑,希望读者在代码中自行完善 

     

     net use命令语法

    作用:连接计算机或断开计算机与共享资源的连接,或显示计算机的连接信息。

    格式:net use devicename | *\\computername\sharename \volume password | */user:domainname\username /delete | /persistent: yer | no

    参数:(1)键入不带参数的net use列出网络连接。

    (2)devicename指定要连接到的资源名称或要断开的设备名称。

    (3)\\computername\sharename服务器及共享资源的名称。

    例:(1)net use \\192.168.18.8\ipc$ "zxcasd" /user:"itcso1" 注释:用户是itcso1,密码是zxcasd,对方IP为192.168.18.8

    (2)net use \\192.168.18.8\ipc$ /delete 注释:退出IPC连接

     

    实战:

     

    --Copy backup file to remote server

    Declare @BKFileName varchar(200)

    Declare @DestFileName varchar(200)

    Declare @FileFlag varchar(8)

    Declare @SQLStr varchar(300)

    Set @FileFlag='20'+convert(char(6),getdate(),12)

    Set @BkFileName='F:\QSBN.BAK'

    Set @DestFileName='\\172.29.68.101\d'

    Set @SQLStr='copy '+@BKFileName+' '+@DestFileName

    Print @SQLStr

    Execute Master..xp_cmdshell @SQLStr

    我的执行代码:

    1、net share test=e:\test

    2、master..xp_cmdshell 'net use  \\liuborui-euera0\test password /user:administrator'

    3、backup database AjjExecuteLaw to disk='\\liuborui-euera0\test\ajjexecute.bak'

    4、master..xp_cmdshell 'net use * /del /y'

    5、net share test /delete

    其中执行第三步时出现了下列问题:

    消息 3201,级别 16,状态 1,第 2 行

    无法打开备份设备 '\\liuborui-euera0\test\ajjexecute.bak'。出现操作系统错误 5(拒绝访问。)。

    消息 3013,级别 16,状态 1,第 2 行

    BACKUP DATABASE 正在异常终止。

    在此感谢 暗香浮动 的提示,因为共享只是简单的共享,所以出现了上述错误,设置文件共享,附给了文件夹EveryOne的写入权限即可。

    在此遗留一个问题:net share test=e:\test如何能给EveryOne权限呢?

     

  • 用户菜单

    我的栏目

    我的存档

    数据统计

    RSS订阅

    Open Toolbar