为什么有两个'。'在sp_executesql之前

时间:2014-04-10 08:33:15

标签: sql sql-server

set @sql = 'exec '+ QUOTENAME(@dbname) + '..sp_executesql N''create schema MyNewSchema'''
exec (@sql)

为什么有两个'。'在sp_executesql之前?我认为应该是一个,不应该?

2 个答案:

答案 0 :(得分:3)

4部分点符号的一般形式是:

servername.database.schema.object

From MSDN,一般形式可以是:

server_name .[database_name].[schema_name].object_name
| database_name.[schema_name].object_name
| schema_name.object_name
| object_name

在您的情况下,已省略架构(第二行)。虽然编码器假设dbo.sp_executesql是唯一具有此名称的对象,但这是危险的做法 - 使用dbName.dbo.sp_executesql会更安全(根据@Hamlet评论的理由,即如果没有显式模式,sql将首先在当前登录的默认模式中查找具有此名称的对象,然后再恢复为dbo模式

答案 1 :(得分:2)

这是一种使用用户默认架构的方法,您可以省略架构名称:

databasename..tablename

一般符号:

  

服务器,数据库和所有者名称称为限定符   对象名称。当您引用某个对象时,您不必这样做   指定服务器,数据库和所有者。限定符可以省略   用一段时间标记他们的位置。对象的有效形式   名称包括以下内容:

     

server_name.database_name.schema_name.object_name

     

server_name.database_name..object_name

     

server_name..schema_name.object_name

     

...服务器名OBJECT_NAME

     

database_name.schema_name.object_name

     

database_name..object_name

     

schema_name.object_name

     

OBJECT_NAME

     

指定所有四个部分的对象名称称为完全   合格的名字。在Microsoft SQL Server中创建的每个对象   必须具有唯一的完全限定名称。例如,可以   如果它们有不同,则在同一数据库中名为xyz的两个表   所有者。

     

大多数对象引用使用三部分名称。默认的server_name   是本地服务器。默认的database_name是当前数据库   连接。默认schema_name是默认架构   用户提交声明。除非另有配置,否则   新用户的默认架构是dbo架构。

参考:http://technet.microsoft.com/en-us/library/ms187879%28v=sql.105%29.aspx