set @sql = 'exec '+ QUOTENAME(@dbname) + '..sp_executesql N''create schema MyNewSchema'''
exec (@sql)
为什么有两个'。'在sp_executesql之前?我认为应该是一个,不应该?
答案 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