我可以使用像abc-123这样的连字符来提供SQL Server数据库名称吗?

时间:2014-01-08 12:15:28

标签: sql sql-server

我创建了一个名为abc-123的sql server数据库,我创建了一个表Emp,当我像

select * from abc-123.emp;
那样运行时,我得到了结果。 但是当我试图向用户授予一些特权时,我无法做到这一点,在连字符附近出现语法错误。

任何人都会帮助我吗?

4 个答案:

答案 0 :(得分:24)

确保使用[](T-SQL)或“”(ANSI SQL)转义名称。您使用的是非标准命名。

-- Sample select
SELECT * FROM [abc-123].[dbo].[emp];
SELECT * FROM "abc-123"."dbo"."emp";

1 - 你能给我一个授权TSQL的例子吗?如果您正在从SSMS执行操作,请右键单击并编写代码脚本。

2 - 这是GRANT TSQL命令的链接。我没有看到你正在尝试的任何语法。

http://technet.microsoft.com/en-us/library/ms188371.aspx

TO 'drupal'@'localhost' IDENTIFIED BY 'Drup@l';

首先,它应该是[drupal@localhost]。其次,我从未见过IDENTIFIED BY条款。你从哪里获得这些信息?

3 - 这是一个快速的TSQL脚本,它创建了一个命名错误的数据库和用户。如果可能,请更改数据库和用户的名称。

此外,如果您在db_owner以外的表级别授予权限(非常精细和大量维护),则创建用户定义的数据库角色。向该角色添加securables并将您的用户添加到该角色。

http://technet.microsoft.com/en-us/library/ms187936.aspx

示例代码。

-- Create new database
create database [abc-123]
go

-- Use new database
use [abc-123];
go

-- Create table from sample data
select 
       [BusinessEntityID]
      ,[PersonType]
      ,[NameStyle]
      ,[Title]
      ,[FirstName]
      ,[MiddleName]
      ,[LastName]
      ,[Suffix]
      ,[EmailPromotion]
      , cast([AdditionalContactInfo] as varchar(max)) 
        as [AdditionalContactInfoTxt]
      , cast([Demographics] as varchar(max)) 
        as [DemographicsTxt]
      ,[rowguid]
      ,[ModifiedDate]
into 
      [abc-123].[dbo].[emp]
from 
      AdventureWorks2012.Person.Person;

-- Create a login
CREATE LOGIN [drupal@localhost] WITH PASSWORD=N'Ja08n13$', DEFAULT_DATABASE=[abc-123]
GO

-- Create a user
CREATE USER [drupal@localhost] FOR LOGIN [drupal@localhost] WITH DEFAULT_SCHEMA=[dbo]
GO

-- Add to database owner role 
EXEC sp_addrolemember 'db_owner', [drupal@localhost]
GO

使用db_owner组中的用户输出。

enter image description here

答案 1 :(得分:2)

使用[]围绕数据库名称:

SELECT * FROM [abc-123].[dbo].emp;

OR

SELECT * FROM [abc-123].dbo.emp;

答案 2 :(得分:2)

对数据库名称使用反引号

select * from `abc-123`.emp;

或者,使用USE语句选择现有数据库并运行查询。

USE `abc-123`;
select * from emp;

答案 3 :(得分:1)

如果您使用带表名的databasename,那么也可以指定schema名称。

select * from [abc-123].dbo.emp