1

您好 SQL Server 专家,

我有一个奇怪的问题,我希望得到一些关于潜在解决方案的反馈: 我正在使用一个需要 ODBC 连接到现有 SQL 数据库的应用程序。但是,数据库的名称中包含破折号(“-”),这会导致应用程序出现语法错误(显然这不是一项出色的开发工作,但我对此无能为力)。

作为该问题的临时解决方案,我创建了数据库的副本并将其重命名为不带破折号。这个目标数据库只用于特定的任务并且不经常更新,但是它每隔几个月就会更新一次,这意味着我必须定期进入并刷新它。我期待开发人员现在能提供解决方案,但他们不合作。

我的问题是:这个问题是否有一些解决方案不需要我刷新我的数据库副本?我应该提到,重命名原始数据库不是一种选择。我是否应该设置一个 SQL 作业来定期将目标数据库还原到我的副本中?

同义词是一种可能的解决方案吗?

谢谢!

编辑:有几个人指出了方括号的使用——这不是一个选择。当我尝试使用 DB Name 字段中的括号时,应用程序 GUI 给我一个错误。

4

3 回答 3

2

主要黑客警报- 不要为数据库创建同义词,而是为其中的所有内容创建同义词!

如果您的应用只需要访问synonyms支持的对象,您可能创建另一个名称更好的数据库,并用原始数据库对象的同义词填充它:

create database MyDatabase;
go
use MyDatabase;
go
create synonym [dbo].[MyTable1] for [My-Database].[dbo].[MyTable1];
create synonym [dbo].[MyView2] for [My-Database].[dbo].[MyView2];
create synonym [dbo].[MyProc3] for [My-Database].[dbo].[MyProc3];
...

这里有一些生成脚本可以帮助解决这个问题:

declare @OldDbName sysname = 'My-Database'
select 'create synonym ' + quotename(schema_name(schema_id)) + '.' + quotename(name) + ' for '
    + quotename(@OldDbName) + '.' + quotename(schema_name(schema_id)) + '.' + quotename(name) + ';'
from sys.objects
where schema_name(schema_id) not in ('sys')
    and type in ('AF', 'FN', 'FS', 'FT', 'IF', 'P', 'PC', 'RF', 'TF', 'U', 'V', 'X')
于 2013-02-13T23:24:33.757 回答
1

您没有提供使用 ODBC 连接的上下文,但您知道当数据库或表包含破折号时,您可以在 SQL 或连接字符串中使用方括号 [My-Database] 括起来的数据库名称?

于 2013-02-13T22:15:46.193 回答
1

我不确定这是否与您的特定上下文直接相关,因为您没有指定这个......但是,您应该尝试将数据库名称包装在方括号中,如此处所述;

http://joseph.randomnetworks.com/2006/09/29/sql-server-escaping-the-database-name/

要对包含空格、连字符 (“-”) 或任何其他特殊字符的数据库名称进行转义,数据库名称必须用括号括起来,如下面的示例所示。在选择也是保留字(例如“primary”)的数据库名称时,也必须应用此技术。

$conn = mssql_connect('SQLSERVERHOST', 'username', 'password');
   mssql_select_db('[database-name]', $conn);
于 2013-02-13T22:16:14.737 回答