none
关于sql server 2008 express 查询Attach数据库的问题。 RRS feed

  • 问题

  • 步骤:

    1、启动系统时,打开Windows资源管理器,查看进程中,不存在sqlservr.exe进程,使用sqlcmd -E -S .\sqlexpress -dmaster

    2、执行查询select name from sysdatabases,结果应该是4个数据库。

    3、启动Visual Studio 2010,在服务器资源视图中,选择数据库连接,附加(或者新创建)一个数据库文件,并连接上。(比如D:\TestDB.mdf文件)

    4、查看Windows资源管理器进程,多了一个sqlservr.exe进程,再使用sqlcmd -E -S .\sqlexpress -dmaster,执行第2步的操作,发现结果还是四个数据库,没有3步附件的数据库。

    我的问题,如果使用sqlcmd 连接我第3步连接成功的数据库。

    2013年7月8日 14:30

答案

  • 如邹建所说,你使用的是用户实例。

    你首先要从 sys.dm_os_child_instances 返回管道名称 (instance_pipe_name),再执行sqlcmd -S pipe_name,连接到这个用户实例。


    想不想时已是想,不如不想都不想。


    2013年7月9日 3:55
    版主
  • 我没有SQL 2008,没法测试。不过你可以试一下USE [E:\TESTDB.MDF]

    想不想时已是想,不如不想都不想。

    • 已标记为答案 王长春1 2013年7月10日 4:21
    2013年7月9日 7:22
    版主
  • 用TSQL还是GUI都可以,不过要

    USE [C:\PROGRAM FILES\MICROSOFT SQL SERVER\MSSQL.3\MSSQL\DATA\GPOSDB.MDF]

    • 已标记为答案 王长春1 2013年7月10日 4:35
    2013年7月9日 9:41

全部回复

  • 1. did you set to start sql service automatically? Can double check in control panel -> services.

    2. how many dbs you got? There are 4 system dbs, you should see at least 4.

    4. are you looking at same sql instance?

    2013年7月8日 16:26
  • sqlcmd -E -S .\sqlexpress 只是连接数据库而不是启动数据库,如果你能连接的话证明你的数据库服务是开启的。

    当然开启数据库可以在配置管理器或者Servcie管理中启动。加载数据库可以直接用SSMS。


    Please Mark As Answer if it is helpful.

    2013年7月9日 1:11
  • 1、服务肯定是启动的,否则第一步使用sqlcmd连接不上数据库的。第2步也查询不出四个数据库

    2、在没有附件数据库的情况下,查询的结果应该只有4个系统库。

    4、使用Visual Studio的服务器资源管理器连打开数据库,查询连接的字符串是:Data Source=.\SQLEXPRESS;AttachDbFilename=D:\TestDB.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True,看来应该还是SQLEXPRESS实例。

    2013年7月9日 1:15
  • 我没有安装SMSS。
    2013年7月9日 1:17
  • User Instance=True,说明你的 VS 使用的是用户实例

    对于用户实例, 用户实例作为用户进程在该用户的安全上下文中运行。用户实例和父实例以及计算机上运行的任何其他用户实例相互独立

    2013年7月9日 2:27
  • 1、服务肯定是启动的,否则第一步使用sqlcmd连接不上数据库的。第2步也查询不出四个数据库

    2、在没有附件数据库的情况下,查询的结果应该只有4个系统库。

    4、使用Visual Studio的服务器资源管理器连打开数据库,查询连接的字符串是:Data Source=.\SQLEXPRESS;AttachDbFilename=D:\TestDB.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True,看来应该还是SQLEXPRESS实例。

    If sql service is running, you should see sqlservr.exe in task manager.
    2013年7月9日 3:04
  • 那我有没有办法使用sqlcmd或者osql连接到(User Instance=True,说明你的 VS 使用的是用户实例)这个用户实例上啊?
    2013年7月9日 3:45
  • 如邹建所说,你使用的是用户实例。

    你首先要从 sys.dm_os_child_instances 返回管道名称 (instance_pipe_name),再执行sqlcmd -S pipe_name,连接到这个用户实例。


    想不想时已是想,不如不想都不想。


    2013年7月9日 3:55
    版主
  • 如果LZ的系统里确实存在sqlserver实例,并且在运行的话,应该会看到相应数目的sqlservr.exe

    比如我的系统是express跟mssql实例并存的

    2013年7月9日 3:59
  • 刚才测试了一下,如果express实例里原本没有任何用户库,当我在VS里附加数据库的时候,然后刷新

    SSMS对象资源管理器,可以看到附近的数据库路径,但是使用TSQL查询该数据库则报错,找不到用户库

    估计VS只是利用sql express的组件来连接数据库,并没有在 sysdatabases表中注册当前用户库

    所以LZ就看不到了,如果LZ要看到您的用户库还是在sqlcmd里使用系统存储过程sp_attach_db来附加数据库

    EXEC [sys].[sp_attach_db] @dbname = NULL, -- sysname
        @filename1 = N'', -- nvarchar(260)
        @filename2 = N'', -- nvarchar(260)
        @filename3 = N'', -- nvarchar(260)
        @filename4 = N'', -- nvarchar(260)
        @filename5 = N'', -- nvarchar(260)
        @filename6 = N'', -- nvarchar(260)
        @filename7 = N'', -- nvarchar(260)
        @filename8 = N'', -- nvarchar(260)
        @filename9 = N'', -- nvarchar(260)
        @filename10 = N'', -- nvarchar(260)
        @filename11 = N'', -- nvarchar(260)
        @filename12 = N'', -- nvarchar(260)
        @filename13 = N'', -- nvarchar(260)
        @filename14 = N'', -- nvarchar(260)
        @filename15 = N'', -- nvarchar(260)
        @filename16 = N'' -- nvarchar(260)

    2013年7月9日 4:09
  • 不过这里有一个奇怪问题,就是在VS服务器资源管理器里删除了连接,但是在SSMS里连接还存在,并且

    在对象资源管理器里能打开表,只是不能通过TSQL来查询数据库

    2013年7月9日 4:12
  • 不错。我查出来后,用sqlcmd -S pipe_name是可以连接上了。但连接上的好像是master数据库。

    我执行select name from sysdatabases后,得出的结果是如下:

    E:\TESTDB.MDF

    很多这样的行。

    然后我执行use "E:\TESTDB.MDF"后,再执行go,提示

    消息 102,级别 15,状态 1,服务器 OSS-WANGCC\B1195A74-F00F-48,第 1 行
    'E:\TESTDB.MDF' 附近有语法错误。

    2013年7月9日 4:55
  • 都说用TSQL不行,用系统存储过程附加数据库吧 

    sp_attach_db

    SELECT * FROM [sys].[sysdatabases]

    查询处理的结果是连版本信息都看不到

    • 已编辑 Steven.桦仔 2013年7月9日 5:05 补充不完整内容
    2013年7月9日 5:01
  • 我没有SQL 2008,没法测试。不过你可以试一下USE [E:\TESTDB.MDF]

    想不想时已是想,不如不想都不想。

    • 已标记为答案 王长春1 2013年7月10日 4:21
    2013年7月9日 7:22
    版主
  • 在VS里删除了连接,但是在SSMS里还能看到连接

    2013年7月9日 9:40
  • 用TSQL还是GUI都可以,不过要

    USE [C:\PROGRAM FILES\MICROSOFT SQL SERVER\MSSQL.3\MSSQL\DATA\GPOSDB.MDF]

    • 已标记为答案 王长春1 2013年7月10日 4:35
    2013年7月9日 9:41
  • 好的。明天我试验一下。如果正确,就是你了。

    2013年7月9日 13:28