Почему «USE» требуется для создания пользовательских типов таблиц? - PullRequest
1 голос
/ 21 мая 2019

Для создания таблиц вы можете сделать это:

CREATE TABLE [MY_DB].[dbo].[MY_TABLE] (
   [MY_MESSAGE] varchar(255)
);

или это:

USE [MY_DB]
CREATE TABLE [dbo].[MY_TABLE] (
   [MY_MESSAGE] varchar(255)
);

Я пытался создать пользовательский тип таблицы следующим образом:

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 - это просто экономия места, предотвращающая необходимость каждый раз вводить имя базы данных. Но с таким поведением здесь я задаюсь вопросом, имеет ли оно какую-то другую цель.

1 Ответ

1 голос
/ 21 мая 2019

Как вы сказали - это так, как это работает.Из документов мы получаем, что CREATE TYPE:

Создает псевдоним типа данных или пользовательский тип в текущей базе данных в SQL Server илиБаза данных SQL Azure.

И синтаксис довольно понятен:

-- User-defined Data Type Syntax    
CREATE TYPE [ schema_name. ] type_name ...

, а для таблиц у нас есть:

--Disk-Based CREATE TABLE Syntax CREATE TABLE
{ database_name.schema_name.table_name | schema_name.table_name | table_name }

Возможно, это связано с тем, что определяемые пользователем типы таблиц не могут совместно использоваться базами данных.Вы можете проверить этот ответ для своего рода обходного пути, используя CLR .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...