2010-07-27 74 views
0

我有我写的这个简单的小批处理文件程序,但是如果输入包含“ - ”字符的数据库名称,它会失败。我不完全确定为什么,但我希望我能找出解决办法?为什么不提示在批处理文件中输入允许DASH字符?

:: open DB batch file 
@echo off 
:: starts Sql Server Management Studio Express 2005 
:: and opens it to a specific database with query 
:: window already open 

cls 

:SHOWDBNAMES 
echo Database names detected on this system: 
echo. 
"%PROGRAMFILES%\Microsoft SQL Server\90\Tools\Binn\OSQL.EXE" -h-1 -S . -E -Q "SELECT CAST(name AS VARCHAR(30)) FROM sysdatabases" 

@echo. 
set DBNAME= 
set /P DBNAME=What database name would you like to open (choose from list)? 

if "%DBNAME%" == "" (
    echo. 
    echo I don't recognize your selection. Try again. 
    goto SELECTDB 
) 

:SHOWTABLES 
cls 
echo. 
echo Tables that you can query from %DBNAME% are: 
echo. 
"%PROGRAMFILES%\Microsoft SQL Server\90\Tools\Binn\OSQL.EXE" -h-1 -S . -E -Q "use [%DBNAME%];SELECT CAST(name AS VARCHAR(30)) FROM sys.Tables ORDER BY name" 
echo. 

:RUNIT 
sqlwb.exe -nosplash -S . -E -d %DBNAME% 

pause 
:EOF 
+0

我认为它的可能性是“ - ”char引发osql.exe,它希望它们是参数标志。不知道如何绕过它。围绕sql字符串的双引号不似乎保护osql不认为它是一个新的arg? – djangofan 2010-07-28 18:48:07

回答

2

尝试封闭在方括号中的数据库名称:

[database-name]

编辑

下面应该工作 - 你需要在调用引用的数据库名sqlwb.exe:

:SHOWTABLES 
cls 
echo. 
echo Tables that you can query from %DBNAME% are: 
echo. 
"%PROGRAMFILES%\Microsoft SQL Server\90\Tools\Binn\OSQL.EXE" -h-1 -S . -E -Q "SELECT CAST(name AS VARCHAR(30)) FROM [%DBNAME%].sys.Tables ORDER BY name" 
echo. 

:RUNIT 
sqlwb.exe -nosplash -S . -E -d "%DBNAME%" 

我不得不问 - 这个脚本有什么意义?内置的SSMS对象浏览器为您免费提供所有这些信息。

此外,您的脚本不考虑默认情况以外的SQL Server实例 - SQL Server Express默认安装为<machine_name>\SQLEXPRESS

+0

尝试过。不能解决sys.Tables查询的问题。我试过“使用[数据库名称];选择.....” – djangofan 2010-07-28 18:33:18

+0

我认为OSQL.exe是一个.exe程序,认为所有的“ - ”字符意味着可执行文件的新参数。这是我最好的猜测。 – djangofan 2010-07-28 19:00:50

+0

@djangofan - 我已经更新了我的答案,并且应该可以正常工作。 – 2010-07-29 08:00:22

0

为什么不试试下划线(_)?

+0

我希望我的脚本支持包括' - '字符在内的所有条件。 – djangofan 2010-07-28 18:33:52

0

当破折号是数据库名称中的第一个字母时,是否在sqlwb.exe行失败?如果是这样,你的问题是sqlwb错误地解释数据库名称作为命令行选项。应该有办法让它不这样做;检查手册。

+0

不,它仅在sys.Tables查询上失败。它在其他地方工作。 – djangofan 2010-07-28 18:32:33

相关问题