为什么创建用户定义的 Table 类型需要 "USE"?
Why is "USE" required for creating User-Defined Table Types?
要创建 table,您可以这样做:
CREATE TABLE [MY_DB].[dbo].[MY_TABLE] (
[MY_MESSAGE] varchar(255)
);
或者这个:
USE [MY_DB]
CREATE TABLE [dbo].[MY_TABLE] (
[MY_MESSAGE] varchar(255)
);
我试图用这种方式创建用户定义的 table 类型:
CREATE TYPE [MY_DB].[dbo].[udtMY_TABLE] AS TABLE (
[MY_MESSAGE] varchar(255)
);
我收到以下错误:
The type name contains more than the maximum number of prefixes. The maximum is 1.
简单的修复,我刚刚做了这个并且工作正常:
USE [MY_DB]
CREATE TYPE [dbo].[udtMY_TABLE] AS TABLE (
[MY_MESSAGE] varchar(255)
);
问题是:为什么创建这种类型需要在此处明确使用 USE
而不是仅允许 [MY_DB].[dbo].[udtMY_TABLE]
?
直到现在我都认为 USE
只是一个 space 的保护程序,避免了每次都输入数据库名称的需要。但是这里的这种行为让我想知道它是否还有其他目的。
如您所说 - 这就是它的工作原理。从 docs 我们有 CREATE TYPE
:
Creates an alias data type or a user-defined type in the current
database in SQL Server or Azure SQL Database.
而且语法非常清晰:
-- User-defined Data Type Syntax
CREATE TYPE [ schema_name. ] type_name ...
而对于 tables 我们有:
--Disk-Based CREATE TABLE Syntax CREATE TABLE
{ database_name.schema_name.table_name | schema_name.table_name | table_name }
可能是因为 user-defined table 类型不能跨数据库共享。您可以查看 a kind of workaround using CLR.
的答案
要创建 table,您可以这样做:
CREATE TABLE [MY_DB].[dbo].[MY_TABLE] (
[MY_MESSAGE] varchar(255)
);
或者这个:
USE [MY_DB]
CREATE TABLE [dbo].[MY_TABLE] (
[MY_MESSAGE] varchar(255)
);
我试图用这种方式创建用户定义的 table 类型:
CREATE TYPE [MY_DB].[dbo].[udtMY_TABLE] AS TABLE (
[MY_MESSAGE] varchar(255)
);
我收到以下错误:
The type name contains more than the maximum number of prefixes. The maximum is 1.
简单的修复,我刚刚做了这个并且工作正常:
USE [MY_DB]
CREATE TYPE [dbo].[udtMY_TABLE] AS TABLE (
[MY_MESSAGE] varchar(255)
);
问题是:为什么创建这种类型需要在此处明确使用 USE
而不是仅允许 [MY_DB].[dbo].[udtMY_TABLE]
?
直到现在我都认为 USE
只是一个 space 的保护程序,避免了每次都输入数据库名称的需要。但是这里的这种行为让我想知道它是否还有其他目的。
如您所说 - 这就是它的工作原理。从 docs 我们有 CREATE TYPE
:
Creates an alias data type or a user-defined type in the current database in SQL Server or Azure SQL Database.
而且语法非常清晰:
-- User-defined Data Type Syntax
CREATE TYPE [ schema_name. ] type_name ...
而对于 tables 我们有:
--Disk-Based CREATE TABLE Syntax CREATE TABLE
{ database_name.schema_name.table_name | schema_name.table_name | table_name }
可能是因为 user-defined table 类型不能跨数据库共享。您可以查看 a kind of workaround using CLR.
的答案