Содержание

T-SQL как создать таблицу, структура которой находится в другой таблице?



Как я могу создать хранимую процедуру для создания таблицы, структура которой хранится в другой таблице, с t-sql, конечно, и sql server?

sql sql-server tsql
Поделиться Источник Edward kevin     14 января 2017 в 19:11

2 ответа


  • Как перебрать таблицу SQL, строки которой «parent» и дочерние» находятся в одной таблице

    В таблице есть столбцы ID, Title и ParentID. ParentID используется для ID записи в той же таблице, которая считается ее родительской-таким образом, любая запись, в которой ParentID является NULL, является той, которая сама является родительской. Мне нужен запрос, который будет перебирать каждого…

  • T-SQL вставка запроса, содержащего ошибку, в другую таблицу

    Я сделал программу для выполнения insert/delete на таблице (main table).

    ..Моя программа также записывает журнал операций (insert/delete), выполненных над этой таблицей, в другую таблицу (audit log table)… Программа записывает журнал для каждой успешной или неудачной операции, выполненной на…



5

T-SQL позволяет создавать таблицы на лету с использованием синтаксиса SELECT * ... INTO :

SELECT * INTO TargetTable
FROM SourceTable
-- any false returning condition will do
WHERE 1 = 0

Это также может быть написано элегантно (благодаря Deadsheep39

):

SELECT TOP 0 * INTO TargetTable
FROM SourceTable

Однако это не сработает, если TargetTable уже существует, поэтому вы должны проверить его существование:

IF OBJECT_ID('TheSchema.TargetTable') IS NOT NULL
    DROP TABLE TargetTable

Кроме того, никакие индексы, ограничения или триггеры не будут созданы. Проверьте здесь для получения более подробной информации.

Если вы хотите перейти к динамике (имена таблиц — это параметры), вы можете создать и выполнить динамический запрос:

CREATE PROCEDURE dbo.GenerateTable
(
    @SourceTable VARCHAR(128),
    @TargetTable VARCHAR(128)
)    
AS
BEGIN
    DECLARE @SQL NVARCHAR(4000) = N'
        SELECT * INTO ' + QUOTENAME(@TargetTable) + '
        FROM ' + QUOTENAME(@SourceTable) + '
        -- any false returning condition will do
        WHERE 1 = 0'
    EXEC (@SQL)
END
GO

Поделиться Alexei     14 января 2017 в 20:00



2

Вы можете построить запрос в виде строки с помощью оператора CREATE TABLE и выполнить его с помощью хранимой процедуры sp_executesql .

Например таким образом:

DECLARE @query nvarchar(max) = N'CREATE TABLE Table(Col nvarchar(50) NULL)'
EXECUTE sp_executesql @query

где в переменной @query вы можете построить таблицу, основанную на том, какая вам нужна таблица.

Поделиться Vasyl Zvarydchuk     14 января 2017 в 19:37


Похожие вопросы:


Как создать таблицу SQL по другой схеме?

Это из SQL Server 2008, ssms Когда я создаю таблицу, она создается под dbo. Я хотел бы создать его по другой схеме, но когда я использую диалог ‘New Table’, я никогда не могу найти поле, где это…


Как вернуть таблицу из хранимой процедуры T-SQL

SQL новичок здесь, и мне чертовски трудно найти то, что должно быть простым примером кода, чтобы ответить на то, что я считаю простым вопросом. Мне нужно написать хранимую процедуру, которая делает…


T-SQL проверьте, находится ли дата в одной таблице между двумя датами в другой таблице, а затем установите значение

У меня есть две таблицы, показанные ниже. Я хочу создать новую переменную (VALUE) на основе приведенной ниже логики и показать результаты в 3-й таблице? Как я могу сделать это в T SQL? Таблице.

..


Как перебрать таблицу SQL, строки которой «parent» и дочерние» находятся в одной таблице

В таблице есть столбцы ID, Title и ParentID. ParentID используется для ID записи в той же таблице, которая считается ее родительской-таким образом, любая запись, в которой ParentID является NULL,…


T-SQL вставка запроса, содержащего ошибку, в другую таблицу

Я сделал программу для выполнения insert/delete на таблице (main table)…Моя программа также записывает журнал операций (insert/delete), выполненных над этой таблицей, в другую таблицу (audit log…


T-SQL создание новых таблиц на основе другой таблицы

Я новичок в T-SQL, поэтому имею нулевые знания &, использую SQL Server 2012. В настоящее время у меня есть таблица под названием dbo.Securities , которая содержит два столбца. Один столбец…


Создайте таблицу, имя которой должно быть первичным ключом в другой таблице

Есть ли способ заставить мою базу данных MySQL разрешить создание новой таблицы с именем table_xyz, только если запись с именем table_xyz существует в другой таблице? В принципе, я хочу, чтобы мое. ..


T-SQL / создайте таблицу, в которой его столбцы зависят от строк другой таблицы

я хочу создать новую таблицу, которая имеет динамическое количество столбцов в зависимости от значений строк другой таблицы. Например, у меня есть таблица (table1), которая имеет 2 столбца с именами…


T-SQL, SSRS: настройка автоматических ежедневных вставок в таблицу

Я использую SQL Server 2012. SSMS 11.0.6248.0. Я хочу создать автоматизированный способ вставки данных [с помощью оператора T-SQL insert] в таблицу SQL Server, прежде чем пользователи начнут…


обновите таблицу, в которой id находится внутри строки

Я хочу обновить таблицу, в которой id находится внутри строки, разделенной запятыми. $str = 1,2,3,4,5,6,7,8,9,10,11; $sql = update abc set status = ‘home’ where id in ‘ . $str . ‘; $st =…

Как создать таблицу в базе данных MS SQL Server 2008

В предыдущей статье показано как создавать новую базу данных в MS SQL Server. Информация в базе данных храниться в таблицах, которые являются отображением некоторых логических общностей. В нашей учебной базе, которая будет моделировать работу некой коммерческой фирмы по продаже товаров, как минимум, будут необходимы пять таблиц:
Sotrudniki — в этой таблице будет храниться информация о сотрудниках — Справочник сотрудников фирмы;

Tovary — будет содержать информацию о товарах — Справочник товаров;
Zakazy — сюда будем заносить информацию о сделанных заказах — оперативная таблица о сделанных заказах;
Zakazchiki — будет хранить информацию о заказчиках — Справочник заказчиков;
Postavschiki — хранит информацию о поставщиках товаров — Справочник поставщиков
Приблизительная номенклатура таблиц ясна. Конкретную структуру таблиц с необходимыми полями будем задавать во время их создания. Сейчас аккурат и займёмся этим моментом. Опять запускаем SQL Server Management Studio, выбираем БД, отмечаем ветку Таблицы и по правой кнопке нажимаем по пункту меню «Создать таблицу»:
Для начала попробуем создать таблицу, в которой будем хранить данные о сотрудниках. Пусть она будет иметь три поля — SotrID (идентификатор сотрудника), FIO (Ф.И.О сотрудника) и Zarplata (Зарплата). Для выполнения этой задачи в колонках Имя столбца и Тип данных заносим соответствующие реквизиты полей таблицы:
Для сохранения введённой информации о структуре таблицы щелкаем правой кнопкой по ярлыку с именем таблицы по умолчанию:
В следующей форме задаём имя таблицы:
После обновления, в «Обозревателе объектов» можно увидеть в списке таблиц только что созданную таблицу:
Первую таблицу в MS SQL Server успешно создали. (пока не обращайте внимание на префикс dbo в имени таблицы. Он означает владельца таблицы — database owner).
Естественно, если мы что-то забыли, всегда можно вставить в структуру таблицы новый столбец. Для этого становимся на нужную таблицу, жмём на правую кнопку мыши и выбираем в контекстном меню «Создать столбец«:
Далее становимся на строке столбца, перед которым желаем вставить новый и по правой кнопке нажимаем по «Вставить столбец«:

Вконтакте

Одноклассники

Мой мир

Facebook

E-mail

Необходимые права доступа к базе данных—ArcGIS Insights

В этом разделе

Подключения к базам данных поддерживаются в Insights in ArcGIS Enterprise и Insights desktop.

Существует два типа операций с данными в ArcGIS Insights:

  • Подключаться к реляционной базе данных и использовать ресурсы без кэширования данных.
  • Подключаться к реляционной базе данных и использовать ресурсы с кэшированием данных.

Подключение к реляционной базе данных и использование ресурсов с кэшированием данных позволяет Insights создавать и работать с временными таблицами в базе данных.

В следующих таблицах перечислены минимально необходимые права доступа для просмотра и подключения к ресурсам реляционной базы данных с дополнительными возможностями Insights, а также для выполнения кэширования данных.

Эти подключения только для чтения.Insights не разрешает создание или изменение данных в этой базе данных.

Данные будут скопированы в размещенное хранилище данных развертывания, если у вас нет необходимых прав доступа базы данных на кэширование данных.

Microsoft SQL Server

Тип операцииНеобходимые праваНазначение

Без кэширования данных

CONNECT

Это право доступа позволяет пользователям подключаться к базе данных.

Привилегия CONNECT предоставляется на уровне базы данных для роли public по умолчанию. Если вы отзываете эту привилегию у public, вы должны явно предоставить право CONNECT конкретным ролям или учетным записям.

SELECT в таблицах других пользователей

Пользователям, просматривающим данные, необходимы права select для таблиц, которые они могут просматривать или запрашивать.

Если все таблицы в базе данных доступны для чтения, вы можете назначить пользователям роль базы данных db_datareader, иначе предоставьте право SELECT для просмотра определенных таблиц и представлений.

С кэшированием данных

Подключения с кэшированием данных требуют также прав доступа на подключение без кэширования данных.

ALTER для схемы

Право доступа ALTER позволяет Insights создавать индексы и управлять временными таблицами в пользовательской схеме.

CREATE TABLE

Право доступа CREATE TABLE позволяет Insights создавать временные таблицы или виды в пользовательской схеме.

Примеры

Следующий код SQL – пример того, как права доступа предоставляются базам данных SQL Server. Администраторы баз данных могут на основе этих примеров настроить предоставление прав доступа пользователям баз данных в своей организации.

Предоставление прав доступа на чтение-запись:

use <databaseName>;
GO
GRANT CREATE TABLE TO <userName>;
GRANT ALTER ON SCHEMA::dbo TO <userName>;
EXEC sp_addrolemember N'db_datareader', N'<userName>';
EXEC sp_addrolemember N'db_datawriter', N'<userName>';
GO

Предоставление прав доступа только на чтение:

use <databaseName>;
GO
EXEC sp_addrolemember N'db_datareader', N'<userName>';
GO

Oracle

Тип операцииНеобходимые праваНазначение

Без кэширования данных

Роль CONNECT или CREATE SESSIONS

Роль CONNECT или CREATE SESSION позволяет пользователям подключаться к базе данных.

Начиная с Oracle 10g Release 2 (10.2), роль CONNECT наделена правами доступа только CREATE SESSION.

SELECT в таблицах других пользователей

Пользователям, просматривающим данные, необходимы права SELECT для тех таблиц, которые они могут просматривать или запрашивать.

С кэшированием данных

Подключения с кэшированием данных требуют также прав доступа на подключение без кэширования данных.

CREATE TABLE*

Право доступа CREATE TABLE позволяет Insights создавать временные таблицы в пользовательской схеме.

*Резервирует соответствующую QUOTA для пользователя в табличном пространстве с помощью команды ALTER USER <username> QUOTA <size> ON <tablespace>.

CREATE SEQUENCE

Право CREATE SEQUENCE позволяет Insights генерировать пространственные индексы.

Примеры

Следующий код SQL – пример того, как права доступа предоставляются базам данных Oracle. Администраторы баз данных могут на основе этих примеров настроить предоставление прав доступа пользователям баз данных в своей организации.

Предоставление прав доступа на чтение-запись:

GRANT CONNECT TO <userName>; 
GRANT CREATE TABLE TO <userName>; 
ALTER USER <userName> QUOTA <size> ON USERS; 
GRANT CREATE SEQUENCE TO <userName>;

Предоставление прав доступа только на чтение:

GRANT CONNECT TO <userName>; 
GRANT SELECT ON <schema>.<tableName> TO <userName>;

PostgreSQL

Тип операцииНеобходимые праваНазначение

Без кэширования данных

CONNECT к базе данных

Это право доступа позволяет пользователям подключаться к базе данных.

Предоставляет право доступа CONNECT к базам данных пользователям с указанными учетными записями.

USAGE для схем пользователей или SELECT для таблиц пользователей

Пользователи, просматривающие данные, должны иметь право доступа USAGE для указанных схем, содержащих пользовательские таблицы. Или право доступа SELECT для указанных таблиц или представлений, которые они могут просматривать или запрашивать.

Предоставляет право SELECT для указанных таблиц или представлений.

С кэшированием данных

Подключения с кэшированием данных требуют также прав доступа на подключение без кэширования данных.

CREATE для схемы

Право доступа CREATE позволяет Insights создавать индексы и управлять временными таблицами в пользовательской схеме.

Примеры

Следующий код SQL – пример того, как права доступа предоставляются базам данных PostgreSQL. Администраторы баз данных могут на основе этих примеров настроить предоставление прав доступа пользователям баз данных в своей организации.

Предоставление прав доступа на чтение-запись:

GRANT CONNECT ON DATABASE <databaseName> TO <userName>;
GRANT USAGE ON SCHEMA <schemaName>TO <userName>;
GRANT CREATE ON SCHEMA <schemaName> TO <userName>;

Предоставление прав доступа только на чтение:

GRANT CONNECT ON DATABASE <databaseName> TO <userName>;
GRANT USAGE ON SCHEMA <schemaName>TO <userName>;   -- Give the access to all tables in the schema
GRANT SELECT ON <tableName> TO <userName>;  -- Or give the access to a specific table

SAP HANA

Тип операцииНеобходимые праваНазначение

Без кэширования данных

SELECT ON sys. st_geometry_columns и sys.st_spatial_reference_systems

Эти права необходимы для чтения метаданных ST_Geometry для пространственных операций.

SELECT ON <table1>,<table2>, <tablen>

Пользователям, просматривающим данные, необходимы права SELECT для тех таблиц, которые они могут просматривать или запрашивать.

С кэшированием данных

Подключения с кэшированием данных требуют также прав доступа на подключение без кэширования данных.

CREATE TABLE

DROP TABLE

Или пользователь должен быть стандартным пользователем HANA.

Позволяет Insights создавать таблицы в пользовательской схеме или удалять их, а также вставлять данные.

Примеры

Следующий код SQL – пример того, как права доступа предоставляются базам данных SAP HANA. Администраторы баз данных могут на основе этих примеров настроить предоставление прав доступа пользователям баз данных в своей организации.

Стандартный пользователь с правами на чтение-запись включает все необходимые права для использования Insights.

Не стандартный пользователь

GRANT SELECT ON SCHEMA <schemaName> to <userName>;   -- executed by the schema owner 
GRANT SELECT ON sys.st_geometry_columns TO <userName>;   -- executed by SYSTEM account
GRANT SELECT ON sys.st_spatial_reference_systems TO <userName>;

Отзыв по этому разделу?

Техническая документация — Техническая документация — Помощь

Наши пользователи могут использовать базы данных Microsoft SQL Server 2012 на своих виртуальных площадках в рамках, предусмотренных соответствующими тарифами.

В стоимость тарифных планов виртуального хостинга, где поддерживаются услуги Microsoft SQL Server, входит определенное число баз данных Microsoft SQL Server и один пользователь Microsoft SQL Server. Сверх этого базы создаются за дополнительную плату по действующему прейскуранту.

Параметры и способы соединения с Microsoft SQL Server

  • Имя хоста (сервера), на котором размещена база данных Microsoft SQL Server: uXXXXX.mssql.masterhost.ru;
  • Порт: 1433;
  • Логин: соответствует названию виртуальной площадки — uXXXXX;
  • Пароль: указан в письме, которое пользователь получает при регистрации;
  • Имя базы данных: соответствует названию виртуальной площадки — uXXXXX;
  • Подключение нужно осуществлять по протоколу TCP/IP.

Подключение к SQL-серверу через «Microsoft SQL Server Management Studio Express»

Чтобы получить доступ к базе данных Microsoft SQL Server, возможно использовать Microsoft SQL Server Management Studio Express.

В свойствах подключения («Options», закладка «Connection Properties») выберите в качестве сетевого протокола («Network Protocol») TCP/IP.

Создание новой базы данных

Новую базу данных вы можете создать через раздел Древо услуг, в Личном кабинете. Выберите нужную «виртуальную площадку», затем в строке «MS SQL — База данных» нажмите кнопку «Добавить».

Использовать Microsoft SQL Server Management Studio для создания новых баз данных нельзя.

Создание нового логина

Создать новый логин для базы данных Microsoft SQL вы можете через раздел Древо услуг, в Личном кабинете. Выберите нужную «виртуальную площадку», затем в строке «MS SQL — Пользователь» нажмите кнопку «Добавить».

Использовать Microsoft SQL Server Management Studio для создания новых логинов нельзя. Также ознакомьтесь с вопросом: «Можно ли на разные базы данных давать разные пароли доступа?».

Увеличение размера базы данных

Увеличить размер базы данных можно самостоятельно, через раздел Древо услуг, в Личном кабинете.

Выберите нужную «виртуальную площадку», затем напротив интересующей базы данных, для услуги «MS SQL — База данных» нажмите кнопку «Изменить» и в выпадающем списке выберите необходимый вам объем базы данных.

Предварительно рекомендуется произвести операцию сжатия базы данных согласно инструкции.

Уменьшение физического размера файлов баз данных и лога транзакций MS SQL Server.

  • Из графического интерфейса Microsoft SQL Server Management Studio:

    • В обозревателе объектов подключитесь к экземпляру SQL Server 2012 Database Engine и разверните его.
    • Разверните узел «Базы данных», затем правой кнопкой мыши щелкните базу данных, которую нужно сжать.
    • В меню «Задачи» выберите «Сжать» и щелкните «База данных». Или установите флажок «Реорганизовать файлы перед освобождением неиспользуемого места».

      Если он установлен, необходимо указать значение параметра «Максимально доступное свободное место в файлах после сжатия».

  • Стандартным t-sql запросом вида:

    DBCC SHRINKFILE (N'uXXXXXX.Log' , 0, TRUNCATEONLY)
    DBCC SHRINKDATABASE (N'uXXXXXX')
    где uXXXXX — имя вашей базы данных.

Изменение кодировки сравнения (collation)

По умолчанию кодировка collation выставлена как Cyrillic_General_CI_AS, изменить кодировку для сравнений можно следующим SQL-запросом:

ALTER DATABASE [uXXXXX] COLLATE SQL_Latin1_General_CP1251_CS_AS
GO

где uXXXXX — имя БД, где требуется данная операция.

Список доступных кодировок можно узнать так:

SELECT * FROM ::fn_helpcollations()

Можно ли использовать MSSQL Server Enterprise Manager для работы со своей базой данных Microsoft SQL Server 2012?

Microsoft SQL Server Enterprise Manager не предназначен для работы с базами данных Microsoft SQL Server 2012. Для управления своей БД можно использовать SQL Server Management Studio, или её бесплатный вариант — Microsoft SQL Server 2012 Management Studio Express.

Как дать права на доступ к базе определенному логину

Для SQL — дополнительный SQL логин, но настраивать права нужно самому: Заводим ещё один SQL логин — uXXX_Ann

Для начала используем нашу базу:

USE [uXXXX]
GO

Создаём пользователя для определённого «логина»:

CREATE USER [InetUser] FOR LOGIN [uXXX_Ann]
GO

Наделяем его правами (например только чтение таблиц):

EXEC sp_addrolemember N'db_datareader', N'InetUser'
GO

Или можем дать пользователю только конкретные права, на конкретные таблицы. Например, давайте дадим пользователю InetUser права на SELECT, INSERT, UPDATE для таблицы test, следующим SQL-запросом:

USE [uXXXXXX]
GO
GRANT SELECT ON [dbo]. [test] TO [InetUser]
GO
GRANT INSERT ON [dbo].[test] TO [InetUser]
GO
GRANT UPDATE ON [dbo].[test] TO [InetUser]
GO

При всем при этом, при осуществлении доступа через SQL Management Studio, под дополнительным логином не являющимся владельцем базы, не будет видно базу данных в списке доступных баз, но будет возможность выполнять разрешенные SQL-запросы.

Как получить раскладку по размеру таблиц в базе

Это можно сделать следующим SQL-запросом:

SET NOCOUNT ON

DBCC UPDATEUSAGE(0)

-- DB size.
EXEC sp_spaceused

-- Table row counts and sizes.
CREATE TABLE #t
(
    [name] NVARCHAR(128),
    [rows] CHAR(11),
    reserved VARCHAR(18),
    data VARCHAR(18),
    index_size VARCHAR(18),
    unused VARCHAR(18)
)

INSERT #t EXEC sp_msForEachTable 'EXEC sp_spaceused ''?'''

SELECT *
FROM   #t

-- # of rows.
SELECT SUM(CAST([rows] AS int)) AS [rows]
FROM   #t

DROP TABLE #t

Полезные ссылки, которые могут облегчить вам работу с базами данных, размещенными на нашем хостинге

Права в MS SQL и создание пользователей.

CREATE USER, GRANT, REVOKE

На первый взгляд, в MS SQL нестандартная система учетных записей. В ней существуют логины и пользователи.

Логины — это понятие всего сервера SQL. У них могут быть права на какие-то административные задачи (например бэкап). Им можно дать права на какие-то действия с базой или таблицой. Для того что бы у логина были права на базу на основе него создается пользователь. Они могут быть как SQL логином, так и созданные на основе  существующих пользователя Windows или AD. Например тот пользователь, который устанавливал MS SQL так же добавился в список логинов. Рекомендуется использовать логины на основе Windows или AD, а не SQL логины.

Пользователи — это понятие в рамках одной базы. Им нельзя дать права по административной части, но можно дать права на работу с базой.

Оба типа учетных записи можно создать как в графике, так и с помощью запроса T-SQL

 

T-SQL CREATE USER, CREATE LOGIN

Перейдем в базу данных, в которой мы работаем:


USE pubs

Для создания логина SQL выполним:


CREATE LOGIN Anton WITH PASSWORD='Password1910'

Anton — имя логина. Password1910 — пароль. У этого логина уже будут права на вход. 

Посмотреть что этот логин создался можно так:

Под номером 3 — это кнопка обновления. Может понадобится т.к. в графике изменения происходят не моментально.

Для создания пользователя привязанного к логину нужно выполнить:


CREATE USER AntonUser FOR LOGIN Anton

Отмечу, что пользователь создасться в той базе, откуда мы выполняем запрос.

Что бы просто создать пользователя нужно:


CREATE USER JustUser WITHOUT LOGIN

Где JustUser — просто пользователь

Созданных пользователей можно увидеть так:

Пользователи создаются без каких либо прав на базу.

T-SQL GRANT

GRANT в пер. «Разрешение» дает права на какое-то действие.

Что бы дать пользователю право получать данные из какой-то таблицы нужно выполнить:


GRANT SELECT ON dbo. authors TO AntonUser

Если мы хотим зайти под созданным пользователем нам нужно выполнить ряд действий. Дело в том, что по умолчанию аутентификация по логинам SQL отключена (разрешена только Windows). Для этого зайдем в свойства сервера:

Затем в «Безопасность» и включи аутентификация SQL

 

Теперь мы сможем зайти под логином SQL. Для этого сделаем следующее — откроем новое окно запросов Ctr + N или нажмем кнопку:

Важно сделать так, что бы у нас было 2 окошка для запросов до того как мы сменем пользователя. Благодаря этому у нас каждое окно будет работать под разными пользователями

Затем окно подключения пользователя:

Меняем тип подключени на SQL и вводим логин/пароль. Я создавал логин Anton, с паролем Password1910.

После подключения можем увидеть, что одно окно работает под логином Anton, а другое под учетной записью с помощью которой мы проводили операции выше. Так же обратите внимания, что новые пользователь подключен к другой базе (master).

Перейдем к базе, на которую мы давали права. В моем случае это база pubs


USE pubs

Я давал права на SELECT для таблицы dbo.authors. Проверем работу:


SELECT *
FROM dbo.authors

Запрос дожен пройти успешно.

Для другой таблицы, на которую мы не давали прав:


SELECT *
FROM dbo.titles

Получим ошибку

The SELECT permission was denied on the object ‘titles’, database ‘pubs’, schema ‘dbo’.

Что бы отозвать разрешение на SELECT нужно заменить GRANT на REVOKE (не забудьте переключится на окно у которого есть разрешение или переключится на предыдущего пользователя):


REVOKE SELECT ON dbo.authors TO AntonUser

Разрешений, которые мы можем выдать пользователю достаточно много. Это основные:

Мы можем так же явно запретить пользователю выполнять определенные запросы. Для этого есть DENY:


DENY SELECT ON dbo.authors TO AntonUser

Что ба дать разрешение на создание таблиц:


USE Pubs;
GRANT CREATE TABLE TO Anton;

 

Теперь создадим логин через графический интерфейс. Нажмем следующие кнопки:

В новом окне мы должны заполнить логин (1) и пароль (3). Под цифрой 2 мы можем увидеть выбор способа аутентификации. В случае Windows мы должны будем выбрать локального пользователя или пользователя AD. Перейдем на закладку Server Roles (4).

Перед нами находятся роли уровня сервера. Все эти роли это просто набор прав. В Microsoft SQL мы так же можем создать и свои группы. Public — роль по умолчанию для всех, кому разрешено вход. Из всех созданных ролей только public можно изменять.

Приведу описание самых популярных ролей:

Перейдем на следующую вкладку (2)

На этой закладке можно сразу создать пользователя и привязать его к базе данных. На этой закладке отображаются 4 базы, которые вы скорее всего раньше не видели. Это системные базы данных, которые хранят в себе транзакции, структуру подключенных баз, скрипты агента и т.д. В области 2 можно дать права на выделенную базу данных.

Коротко о нескольких ролях баз данных:

Роль public, в отличии от всех остальных, можно изменять. Т.е. можно дать роли public разрешение на SELECT и тогда все пользователи с логином смогут это делать. По умолчанию эта ролько может делать запросы типа:


SELECT 1+1

 

Теги: #ms-sql

Microsoft SQL Server. Как скопировать таблицу из другой базы

  • Статьи
  • Администрирование
  • MS SQL
  • Microsoft SQL Server. Как скопировать таблицу из другой базы
Существует несколько способов копирования таблицы в базе данных MS SQL Server. Предлагаю несколько вариантов создания копии таблиц. Какой из них выбрать – зависит от структуры таблицы, наличия в ней индексов, триггеров и т.п., а также желания делать что-то руками.

1. Ручной метод копирования структуры таблицы

В Micrisoft SQL Management Studio выбрать базу, выбрать таблицу, нажать правой кнопкой мыши и выбрать пункты «Script Table as» -> «CREATE TO» -> «New Query Editor Window». В окне запроса откроется код для создания таблицы. В нем нужно указать имя базы, в которой нужно сделать копию таблицы, и новое имя, если база не меняется. Как создать код для создания структуры имеющейся таблицы, показано на рисунке ниже.


С помощью этого способа будут созданы индексы таблицы, но не скопируются триггеры. Их нужно копировать аналогичным способом.

Для копирования данных в уже созданную таблицу нужно использовать такой SQL запрос:

 

INSERT into [db2]. [dbo].tmp_tbl_Deps SELECT * FROM [db1].[dbo].tbl_Deps

2. Копирование SQL таблицы запросом в одну строчку

Сделать копию структуры таблицу и данных внутри одной базы:

 

SELECT * into tmp_tbl_Dep FROM tbl_Deps

Скопировать структуры таблицу и ее данные из одной базы в другую:

 

SELECT * into [Db2].[dbo].tmp_tbl_Deps FROM [Db1].[dbo].tbl_Deps

Минус у такого решения – не копируются индексы.

Метки: SQL

Лабораторная работа №1

NO:user
READ:@ALL
EDIT:@ALL

Цели:

  • Изучение основных конструкций структурированного языка запросов SQL.

  • Изучения среды MS SQL Server Management Studio.

  • Приобретение навыков проектирования структур данных.

Базы данных составляют основу для построения информационных систем любого масштаба и предназначения. В теории баз данных одними из основных являются вопросы, связанные с анализом предметной области и моделированием структуры данных, управлением данными и их анализом.

Основой любой базы данных является реализованная в ней модель данных, представляющая собой множество структур данных, ограничений целостности и операций манипулирования данными. С помощью модели данных могут быть представлены объекты предметной области и существующие между ними связи.

Результатом лабораторной работы будет создание реляционной базы данных на основе MS SQL Server 2005.

В реляционной базе данных данные представлены в виде собрания таблиц. Таблица состоит из определенного числа столбцов (полей) и произвольного числа строк (записей).

Планируемая база данных будет представлять собой информационное хранилище данных об успеваемости студентов и состоять из следующих таблиц:

Speciality (специальность)
Course (курс)
Group (группа)
Discipline (дисциплина)
Account (тип отчетности)
Mark (отметка)
Status (академический статус студента)
Position (должность)
People (люди)
Student (студент)
Teacher (преподаватель)
SemesterResults (результаты сессии, семестра)

Структура данных таблиц приведена в Приложении.

1. Начало работы в Microsoft SQL Server Management Studio

Для создания баз данных используем среду Microsoft SQL Server Management Studio. На запрос соединения с сервером выбираем (рис. 1):

Тип сервера: Компонент Database Engine

Имя сервера: SQL-MS.

Под таким именем в домене fizmat.vspu.ru. доступна машина, на которой установлены серверные компоненты MS SQL Server 2005. Можно попробовать выбрать сервер из выпадающего списка серверов. Можно также обратиться к этой машине по IP-адресу 192.168.10.152 из локальной сети.

Проверка подлинности: Проверка подлинности SQL Server.

Такая настройка позволяет создавать пользователей данного экземпляра SQL Server независимо от компьютера, с которого производится вход.

Имя входа: studentMBS21.

Пароль: student.

Рисунок 1. Окно входа в Microsoft SQL Server Management Studio 2005

Примечание. Пользователь studentMBS21 обладает большими полномочиями на этом сервере, поэтому пользоваться им надо очень аккуратно. Под этим пользователем мы создадим базу данных, а заполнять её и производить поиск по ней мы будем под другими пользователями. Предпочтительнее всего использовать свою учетную запись в домене fizmat.vspu.ru. В этом случае надо выбирать проверку подлинности Windows.

Теперь нажимаем кнопку «Параметры» и выбираем (рис. 2):

Соединение с базой данных → Обзор сервера… → Пользовательские базы данных → trial_base.

Сетевой протокол → TCP/IP

Нажимаем кнопку «Соединить».

Рисунок 2. Окно входа в Microsoft SQL Server Management Studio 2005 (вкладка Параметры)

Примечание. База данных trial_base является базой данной по умолчанию для пользователя studentMBS21, она была создана при регистрации этого пользователя. В случае, когда права доступа пользователя не ограничены (как в рассматриваемом случае), вкладку Параметры можно не открывать. Если же пользователь имеет доступ только к определенным базам данных, при подключении к серверу нужно одну из этих баз указывать.

После успешного соединения с базой данных на экране видим следующую картинку (рис. 3):

Рисунок 3. Подключение к SQL — серверу установлено

Среда MS SQL Management Studio предоставляет удобный инструментарий для создания, редактирования, заполнения баз данных. Но настоящие профессионалы в своей работе редко пользуются этой средой, а для выполнения своих задач используют SQL-запросы. Мы будем пользоваться, когда это удобно и наглядно, графическим режимом, но основной упор будем делать на освоении базы языка SQL.

2. Создание базы данных в среде Microsoft SQL Server Management Studio

В разделе «Базы данных» правой кнопкой выбираем «Создать базу данных…» (рис. 4). Назовем базу данных по индексу группы – mbs21. Владельцем базы данных назначим пользователя, под именем которого был произведен вход – studentMBS21. В разделе «Параметры» выбираем тип сортировки Cyrillic_General_BIN (для примера), нажимаем ОК.

Рисунок 4. Создание базы данных

В разделе «Базы данных» Обозревателя объектов появилась вновь созданная mbs21 (проверьте!):

Рисунок 5. Обозреватель объектов

3. Создание таблиц базы данных в среде Microsoft SQL Server Management Studio

Начнем с создания таблицы Speciality. Структура таблицы приведена ниже:

Имя поля (столбца) Содержание Тип данных Возможность содержать NULL
Num Первичный ключ int нет
Name Название специальности varchar(60) нет

В реляционных базах данных первичный ключ используется как уникальный идентификатор записи. Это поле является обязательным, оно используется для связи таблиц по внешним ключам (примеры такого связывания будут рассмотрены далее). Первичный ключ должен иметь целочисленный тип (в данном случае — int). Во втором поле будет храниться название специальности — некоторая строка, поэтому мы выбираем для этого поля тип varchar(60). Число в скобках означает максимальное число символов в строке. Детальную информацию об этих типах можно посмотреть в справке.

Простейшим образом можно создавать таблицы средствами MS SQL Server Management Studio (правая кнопка мыши на заголовке «Таблицы» > Создать таблицу.). Получаем следующее:

Рисунок 6. Создание таблицы

Вводим имя первого столбца Num (первичный ключ – в том столбце хранится номер записи), выбираем из выпадающего списка тип данных int. Первичный ключ не может быть пустым, поэтому и оставляем неотмеченным поле «Разрешить значения null». Затем аналогичным образом вводим имя второго столбца, задаем тип, запрещаем полю иметь значение null. Таблица принимает следующий вид:

Рисунок 7.

Теперь необходимо указать, что поле Num будет являться первичным ключом. Правой кнопкой мыши щелкаем по этому полю и выбираем «Задать первичный ключ»:

Рисунок 8.

Сохраняем таблицу под именем Speciality (после этого таблица должна появиться в обозревателе объектов). Теперь можно перейти к заполнению этой таблицы (для этого нужно в обозревателе объектов выбрать эту таблицу и в контекстном меню нажать «Открыть таблицу»):

Рисунок 9.

При заполнении вы обнаружите, что каждый раз приходится вводить не только полезную информацию (название специальности), но и номер записи. Чтобы вводить номер записи автоматически, нужно задать спецификацию идентифицирующего столбца. Для этого необходимо в свойствах столбца указать, что данный столбец является идентифицирующим (рис. 10):

Рисунок 10. Определение свойств идентифицирующего столбца

4. Создание таблиц базы данных с помощью SQL-запроса

Создание таблиц в графическом режиме, безусловно, удобно, однако не универсально. При использовании других средств разработки баз данных (например, IBM DB2) придется привыкать к новым приемам работы. Использование конструкций языка SQL позволяет работать с базами данных, исходя из единого подхода, в любой среде управления базами данных.

Выберите на панели инструментов «Создать запрос»:

Рисунок 11.

Создадим новую базу данных запросом. Напишем

CREATE DATABASE mbs21_query

и нажмем F5. В обозревателе объектов должна появиться новая база (если сразу не появилась, то надо выделить мышью раздел «Базы данных» и в контекстном меню выбрать «Обновить»).

Теперь создадим таблицу Speciality. Упрощенный синтаксис создания таблиц следующий:

CREATE TABLE <имя таблицы> (
    <имя столбца 1> <тип данных> [NOT NULL] [DEFAULT <значение по умолчанию>],
    <имя столбца 2> <тип данных> [NOT NULL] [DEFAULT <значение по умолчанию>],
    ...
)

Введем новый запрос:

/* создание таблицы Специальность*/
USE mbs21_query                                   -- определяем базу данных, в которую входит таблица
CREATE  TABLE  Speciality( 
    Num  INT IDENTITY(1,1) PRIMARY KEY NOT NULL, -- первичный ключ 
    NameSpec VARCHAR(60)                          -- название специальности
)

В обозревателе объектов видим, что таблица действительно создана. Файл с SQL-запросом сохраняем в своей папке (в конце работы необходимо показать запросы, которые были выполнены, преподавателю). Слово IDENTITY(1,1) добавлено, чтобы поле первичного ключа Num автоматически нумеровалось начиная с единицы (фактически, эта конструкция определяет спецификацию идентифицирующего столбца).

Таким же образом необходимо создать остальные таблицы. Рассмотрим таблицу Course.

Таблица Course (курс)

Имя поля (столбца) Содержание Тип данных Возможность содержать NULL
Num Первичный ключ int нет
Name Название специальности varchar(60) нет
YearEntry Год поступления int нет
YearFinal Год выпуска int да
Speciality Специальность (внешний ключ ссылается на первичный ключ таблицы Speciality) int нет

Эта таблица содержит поле Speciality, которое ссылается на первичный ключ таблицы Speciality. Чтобы создать такую таблицу, необходимо выполнить запрос:

/* создание таблицы Курс */
USE mbs21_query                                  -- определяем базу данных, в которую входит таблица
CREATE  TABLE  Course( 
    Num  INT IDENTITY(1,1) PRIMARY KEY NOT NULL, -- первичный ключ
    YearEntry INT NOT NULL,                      -- год поступления
    YearFinal INT,                               -- год окончания
    Speciality INT FOREIGN KEY REFERENCES Speciality(Num) -- специальность,
    -- ссылка по внешнему ключу на поле Num таблицы Speciality
)

Примечание. Ссылку можно создать только на существующую таблицу. Задать ссылку по внешнему ключу можно и после создания таблицы (подробно будет рассмотрено в следующей лабораторной работе).

Задание. Создайте все остальные таблицы, указанные в Приложении, используя SQL – запросы.

Приложение. Структура данных

Таблица Speciality (специальность)

Имя поля (столбца) Содержание Тип данных Возможность содержать NULL
Num Первичный ключ int Нет
Name Название varchar(60) Нет

Таблица Course (курс)

Имя поля (столбца) Содержание Тип данных Возможность содержать NULL
Num Первичный ключ int нет
Name Название специальности varchar(60) нет
YearEntry Год поступления int нет
YearFinal Год выпуска int да
Speciality Специальность (внешний ключ ссылается на первичный ключ таблицы Speciality) int нет

Таблица Group (группа)

Имя поля (столбца) Содержание Тип данных Возможность содержать NULL
Num Первичный ключ int нет
Name Название специальности varchar(60) нет
Course Курс (внешний ключ ссылается на первичный ключ таблицы Course ) int нет

Таблица Discipline (дисциплина)

Имя поля (столбца) Содержание Тип данных Возможность содержать NULL
Num Первичный ключ int Нет
Name Название (возможные значения: программирование, алгебра…) varchar(60) Нет

Таблица Account (тип отчетности)

Имя поля (столбца) Содержание Тип данных Возможность содержать NULL
Num Первичный ключ int Нет
Name Название (возможные значения: экзамен, зачет, дифференцированный зачет…) varchar(30) Нет

Таблица Mark (отметка)

Имя поля (столбца) Содержание Тип данных Возможность содержать NULL
Num Первичный ключ int Нет
Name Название (возможные значения: зачтено, не зачтено, отлично, хорошо…) varchar(30) Нет
Value Значение (возможные значения: 0, 1, …, 5) int Нет

Таблица Status (академический статус студента)

Имя поля (столбца) Содержание Тип данных Возможность содержать NULL
Num Первичный ключ int Нет
Name Название (возможные значения: обучается, отчислен, в академическом отпуске, в отпуске по уходу за ребенком)varchar(60) Нет

Таблица Position (должность)

Имя поля (столбца)Содержание Тип данных Возможность содержать NULL
Num Первичный ключ int Нет
Name Название (возможные значения: ассистент, старший преподаватель, доцент…) varchar(60) Нет

Таблица People (люди)

Имя поля (столбца) Содержание Тип данных Возможность содержать NULL
Num Первичный ключ int Нет
LastName Фамилия varchar(30) Нет
FirstName Имя varchar(30) Нет
MiddleName Отчество varchar(30)Да
Male Пол char(1) Нет
BrthDate День рождения datetime Да
Addr Адрес varchar(100) Да

Таблица Student (студент)

Имя поля (столбца) Содержание Тип данных Возможность содержать NULL
Num Первичный ключ int Нет
People Человек (внешний ключ ссылается на первичный ключ таблицы People) int Нет
Group Группа (внешний ключ ссылается на первичный ключ таблицы Group) int Нет
StudNum Номер студенческого билета varchar(30) Нет
Status Академический статус студента (внешний ключ ссылается на первичный ключ таблицы Status) int Нет

Таблица Teacher (преподаватель)

Имя поля (столбца) Содержание Тип данных Возможность содержать NULL
Num Первичный ключ (табельный номер сотрудника) int Нет
People Человек (внешний ключ ссылается на первичный ключ таблицы People) int Нет
Position Должность (внешний ключ ссылается на первичный ключ таблицы Position) int Нет

Таблица SemesterResults (результаты сессии)

Имя поля (столбца) Содержание Тип данных Возможность содержать NULL
Num Первичный ключ int Нет
Student Студент (внешний ключ ссылается на первичный ключ таблицы Student) int Нет
Semester Порядковый номер семестра int Нет
Account Тип отчетности (внешний ключ ссылается на первичный ключ таблицы Account) int Нет
Discipline Дисциплина (внешний ключ ссылается на первичный ключ таблицы Discipline) int Нет
Teacher Преподаватель (внешний ключ ссылается на первичный ключ таблицы Teacher) int Нет
Mark Отметка (внешний ключ ссылается на первичный ключ таблицы Mark) int Нет
Date Дата сдачи отчетности DateTime Нет

Контрольные вопросы

  • Каким образом можно получить доступ к MS SQL Server 2005?

  • С помощью каких средств можно создать таблицу для MS SQL Server 2005?

  • Что такое первичный ключ?

  • Каким образом можно создать автоматическую нумерацию строк таблицы?

  • Что означают Not Null?

 

Назад: Лабораторная работа №1

CREATE DATABASE & CREATE TABLE Операции

Добро пожаловать в первую статью из серии Learn SQL. В этой части мы начнем с двух основных команд SQL: Создать базу данных и создать таблицу. Хотя оба варианта довольно просты, их следует использовать перед тем, как вы начнете что-либо работать с данными (если вы не используете какую-либо базу данных шаблонов).

Позже в этой серии я постараюсь охватить все, что необходимо новичку, чтобы окунуться в волшебный мир SQL и баз данных.Итак, начнем:

Цель этой статьи — создать базу данных (с помощью команды SQL Create Database) и двух таблиц (с помощью SQL Create Table), как показано на рисунке выше. В следующих статьях мы будем вставлять данные в эти таблицы, обновлять и удалять данные, а также добавлять новые таблицы и создавать запросы.

Что такое база данных?

Прежде чем мы создадим базу данных с помощью команды SQL Create database, я хочу определить, что такое база данных.Я буду использовать определение, предоставленное Oracle:

База данных — это организованный набор структурированной информации или данных, обычно хранящихся в электронном виде в компьютерная система. База данных обычно контролируется системой управления базами данных (СУБД). (источник: https://www.oracle.com/database/what-is-database.html)

В этой статье я буду использовать версию Microsoft SQL Server Express. Итак, СУБД — это SQL Server, а язык, который мы будем использовать, — это T-SQL.Еще раз приведу цитату:

T-SQL (Transact-SQL) — это набор программных расширений от Sybase и Microsoft, которые добавляют несколько функций в язык структурированных запросов (SQL), включая управление транзакциями, обработку исключений и ошибок, обработку строк и объявленные переменные. (источник: https://searchsqlserver.techtarget.com/definition/T-SQL)

Я не буду углубляться в эту статью, но мы можем завершить эту часть утверждением, что база данных — это организованный набор таблиц, содержащих данные из реального мира и некоторые дополнительные столбцы, необходимые для правильной работы системы.Мы обсудим это в следующих статьях.

Оператор создания базы данных SQL

После установки и открытия Microsoft SQL Server Management Studio наш экран выглядит примерно так:

Это совсем не выглядит забавным. Мы сделаем это веселее, создав новую базу данных. После нажатия New Query открывается новое окно, и мы можем что-то ввести. Это выглядит как на картинке ниже:

Прежде чем что-либо вводить, мы должны убедиться, что набираем его правильно.T-SQL — это язык, и поэтому у него есть свои слова — набор правил о том, как писать различные команды.

К счастью, одна из этих команд — команда SQL Create Database. Вы можете увидеть полный синтаксис T-SQL Create Database на страницах Microsoft.

Я буду сильно упрощать его и буду использовать только самую простую форму. Чтобы создать новую базу данных на нашем сервере, мы необходимо использовать следующую команду:

СОЗДАТЬ БАЗУ ДАННЫХ имя_базы_данных;

Где мы будем использовать желаемое имя вместо database_name .

Пример создания базы данных SQL

Хорошо, давай попробуем. Запустим команду:

СОЗДАТЬ БАЗУ ДАННЫХ our_first_database;

После выполнения этой команды наша база данных создана, и вы можете увидеть ее в списке баз данных:

Нажмите на + рядом с папкой Базы данных , и помимо двух папок вы также увидите, что our_first_database был создан.

Это здорово, и вы только что успешно создали свою первую базу данных. Проблема в том, что у нас ничего не хранится в базе данных. Давай изменим это.

Оператор создания таблицы SQL

В теории баз данных таблица — это структура («базовая единица»), используемая для хранения данных в базе данных.

Я очень люблю использовать аналогии, поэтому сделаю это и здесь. Если вы думаете о библиотеке, база данных — это одна полка с книгами, а каждая книга — это таблица. Каждая книга имеет собственное содержание, но каким-то образом связана с другими книгами на той же полке — либо благодаря совместным свойствам, либо просто находясь рядом.

За таблицами базы данных и тем, как решить, что и куда следует, стоит много теории, но самое простое, что вы можете сделать, — это следовать. Когда мы смотрим на наши данные и нам нужно решить, что происходит, где мы должны группировать данные в таблицах в таком виде способ, которым все, что принадлежит одной и той же реальной сущности, попадает в одну и ту же таблицу.

Например. если мы хотим хранить данные, описывающие города и страны, у нас будет две отдельные таблицы в нашей базе данных — одна для городов, а другая для стран. Мы не будем смешивать их данные, а скорее свяжем их. Это выходит за рамки данной статьи и будет рассмотрено в следующих частях этой серии.

Чтобы определить таблицу, мы будем следовать синтаксису. Здесь вы можете увидеть полный синтаксис T-SQL Create Table, но я еще раз упрощу инструкцию:

CREATE TABLE имя_таблицы (

имя_столбца тип_столбца,

имя_столбца тип_столбца,

. ..

);

Мы просто выберем имя для нашей таблицы и перечислим все столбцы, которые мы хотим иметь в этой таблице. Столбцы также называются атрибутами, и каждый столбец описывает свойство одной записи в таблице. Столбец имеет свой тип, и мы следует выбрать тип на основе значений, которые мы ожидаем в этом столбце (число, текст и т. д.).

Пример создания таблицы SQL

Давайте посмотрим на определение двух наших таблиц:

Сначала мы определим таблицу city .

— Таблица: city

CREATE TABLE city (

id int NOT NULL IDENTITY (1, 1),

city_name char (128) NOT NULL,

lat decimal (9,6) NOT NULL,

длинное десятичное (9,6) НЕ NULL,

country_id int NOT NULL,

CONSTRAINT city_pk PRIMARY KEY (id)

);

Обратите внимание на несколько вещей:

  • NOT NULL -> Это свойство сообщает нам, что этот столбец не может быть пустым (должен быть определен)
  • IDENTITY (1, 1) -> также свойство столбца, говорящее нам, что это значение должно быть сгенерировано автоматически, начиная с 1 и увеличивая на 1 для каждой новой записи
  • CONSTRAINT city_pk PRIMARY KEY (id) -> Это не столбец, а правило, сообщающее нам, что идентификатор столбца должен содержат только УНИКАЛЬНЫЕ значения. Таким образом, только 1 город может иметь id = 5

— Таблица: страна

СОЗДАТЬ ТАБЛИЦУ country (

id int NOT NULL IDENTITY (1, 1),

country_name char (128) NOT NULL,

country_name_eng char (128) NOT NULL,

country_code char (8) NOT NULL,

CONSTRAINT country_ak_1 UNIQUE (country_name),

CONSTRAINT country_ak_2 UNIQUE (country_name_eng),

CONSTRAINT country_ak_3 UNIQUE (country_code),

PRSTRAINT country_pk

Здесь у нас есть 1 новое ОГРАНИЧЕНИЕ, и это УНИКАЛЬНОЕ ограничение.Это говорит нам, что это значение должно быть УНИКАЛЬНЫМ. в этой таблице. Например. CONSTRAINT country_ak_1 UNIQUE (country_name) определяет, что мы не можем хранить 2 страны с таким же названием.

Последняя часть скрипта — определение внешних ключей. У нас всего 1 такой ключ и он связывает город и таблица страны ( city. county_id = country.id ).

— внешние ключи

— Ссылка: city_country (таблица: city)

ALTER TABLE city ADD CONSTRAINT city_country

FOREIGN KEY (country_id)

REFERENCES country (id);

Ключи (первичные и иностранные) слишком сложны, поэтому им будет посвящена отдельная статья.После выполнения этих команд, статус нашей базы данных как на картинке ниже:

Заключение

Поздравляю. Вы успешно создали свою первую базу данных с помощью команд SQL Create Database и Create Table. У нас в базе есть 2 таблицы. Теперь мы готовы заполнить их данными и проверить, правильно ли мы сделали это. Мы сделаем это в следующей статье, так что следите за обновлениями!

Содержание

Эмиль — профессионал в области баз данных с более чем 10-летним опытом работы во всем, что связано с базами данных. В течение многих лет он работал в сфере информационных технологий и финансов, а сейчас работает фрилансером.

Его прошлые и настоящие занятия варьируются от дизайна и программирования баз данных до обучения, консультирования и написания статей о базах данных. Также не забывайте, BI, создание алгоритмов, шахматы, филателия, 2 собаки, 2 кошки, 1 жена, 1 ребенок …

Вы можете найти его в LinkedIn

Посмотреть все сообщения Эмиля Drkusic

Последние сообщения Эмиля Drkusic (увидеть все) Сценарий

— как в SQL Server создать оператор CREATE TABLE для данной таблицы?

— или вы можете создать хранимую процедуру… сначала с созданием Id

  ИСПОЛЬЗОВАНИЕ [db]
ИДТИ

/ ****** Объект: StoredProcedure [dbo]. [ProcUtils_InsertGeneratorWithId] Дата сценария: 13.06.2009 22:18:11 ****** /
УСТАНОВИТЬ ANSI_NULLS ON
ИДТИ

ВКЛЮЧИТЬ QUOTED_IDENTIFIER
ИДТИ


создать PROC [dbo]. [procUtils_InsertGeneratorWithId]
(
@domain_user varchar (50),
@tableName varchar (100)
)


в качестве

--Объявить курсор для получения информации о столбце для указанной таблицы
ОБЪЯВИТЬ КУРСОР cursCol FAST_FORWARD ДЛЯ
ВЫБЕРИТЕ имя_столбца, тип_данных из информационной_схемы. столбцы WHERE table_name = @tableName
ОТКРЫТЬ cursCol
DECLARE @string nvarchar (3000) - для хранения первой половины оператора INSERT
DECLARE @stringData nvarchar (3000) - для хранения оператора, связанного с данными (ЗНАЧЕНИЯ)
DECLARE @dataType nvarchar (1000) - типы данных, возвращаемые для соответствующих столбцов
ОБЪЯВИТЬ @IDENTITY_STRING nvarchar (100)
НАБОР @IDENTITY_STRING = ''
выберите @IDENTITY_STRING
SET @ string = 'INSERT' + @ tableName + '('
НАБОР @ stringData = ''

ОБЪЯВИТЬ @colName nvarchar (50)

ПОЛУЧИТЬ ДАЛЕЕ ИЗ cursCol В @ colName, @ dataType

ЕСЛИ @@ fetch_status <> 0
 начинать
 print 'Table' + @ tableName + 'не найден, обработка пропущена.'
 закрыть curscol
 освободить curscol
 возвращаться
КОНЕЦ

ПОКА @@ FETCH_STATUS = 0
НАЧИНАТЬ
ЕСЛИ @dataType in ('varchar', 'char', 'nchar', 'nvarchar')
НАЧИНАТЬ
 --SET @ stringData = @ stringData + '' '' '' '' '+ isnull (' + @ colName + ',' '' ') +' '' '' ',' '+' '
 SET @ stringData = @ stringData + '' '' + '' '+ isnull (' '' '' + '' '' '+' + @ colName + '+' '' '+' '' '', '' NULL '') + '', '' + ''
КОНЕЦ
ЕЩЕ
if @dataType in ('text', 'ntext') - если тип данных - текст или что-то еще
НАЧИНАТЬ
 SET @ stringData = @ stringData + '' '' '' '' '+ isnull (cast (' + @ colName + 'как varchar (2000)),' '' ') +' '' '' ',' '+'
КОНЕЦ
ЕЩЕ
IF @dataType = 'money' - потому что деньги не конвертируются из varchar неявно
НАЧИНАТЬ
 SET @ stringData = @ stringData + '' 'convert (money,' '' '' '+ isnull (cast (' + @ colName + 'as varchar (200)),' '0. 0000 '') + '' '' ''), '' + '
КОНЕЦ
ЕЩЕ
ЕСЛИ @ dataType = 'datetime'
НАЧИНАТЬ
 --SET @ stringData = @ stringData + '' 'convert (datetime,' '' '' '+ isnull (cast (' + @ colName + 'as varchar (200)),' '0' ') +' '' '' '),' '+'
 --ВЫБОР 'INSERT Authorizations (StatusDate) VALUES (' + 'convert (datetime,' + isnull ('' '' + convert (varchar (200), StatusDate, 121) + '' '', 'NULL') + ' , 121),) 'ИЗ авторизаций
 --SET @ stringData = @ stringData + '' 'convert (money,' '' '' '+ isnull (cast (' + @ colName + 'as varchar (200)),' '0.0000' ') +' '' '' '),' '+'
 SET @ stringData = @ stringData + '' 'convert (datetime,' + '' '+ isnull (' '' '' + '' '' '+ convert (varchar (200),' + @ colName + ', 121) +' '' '' + '' '' ',' 'NULL' ') +' ', 121),' '+'
  - 'convert (datetime,' + isnull ('' '' + convert (varchar (200), StatusDate, 121) + '' '', 'NULL') + ', 121),)' ИЗ авторизации
КОНЕЦ
ЕЩЕ
ЕСЛИ @ dataType = 'изображение'
НАЧИНАТЬ
 SET @ stringData = @ stringData + '' '' '' '' '+ isnull (cast (convert (varbinary,' + @ colName + ') as varchar (6)),' '0' ') +' '' '' ' , '' + '
КОНЕЦ
ELSE - предположим, что тип данных - int, bit, numeric, decimal
НАЧИНАТЬ
 --SET @ stringData = @ stringData + '' '' '' '' '+ isnull (cast (' + @ colName + 'as varchar (200)),' '0' ') +' '' '' ',' '' ' + '
 --SET @ stringData = @ stringData + '' 'convert (datetime,' + '' '+ isnull (' '' '' + '' '' '+ convert (varchar (200),' + @ colName + ', 121) + '' '' '+' '' '', '' NULL '') + '', 121), '' + '
 SET @ stringData = @ stringData + '' '' + '' '+ isnull (' '' '' + '' '' '+ convert (varchar (200),' + @ colName + ') +' '' '' + ' '' '', '' NULL '') + '', '' + '
КОНЕЦ

SET @ строка = @ строка + @ colName + ','

ПОЛУЧИТЬ ДАЛЕЕ ИЗ cursCol В @ colName, @ dataType
КОНЕЦ
ОБЪЯВИТЬ @Query nvarchar (4000)

НАБОР @query = 'SELECT' '' + substring (@ string, 0, len (@string)) + ') VALUES (' '+' + substring (@ stringData, 0, len (@stringData) -2) + ' '' + '') '' ОТ '+ @ имя_таблицы
exec sp_executesql @query
--select @query

ЗАКРЫТЬ cursCol
ОТКЛЮЧИТЬ cursCol


  / *
ИСПОЛЬЗОВАНИЕ

* /

ИДТИ
  

— и второй без ВСТАВКИ ID

  ИСПОЛЬЗОВАНИЕ [db]
ИДТИ

/ ****** Объект: StoredProcedure [dbo]. [procUtils_InsertGenerator] Дата сценария: 13.06.2009 22:20:52 ****** /
УСТАНОВИТЬ ANSI_NULLS ON
ИДТИ

ВКЛЮЧИТЬ QUOTED_IDENTIFIER
ИДТИ

СОЗДАТЬ ПРОЦЕСС [dbo]. [ProcUtils_InsertGenerator]
(
@domain_user varchar (50),
@tableName varchar (100)
)


в качестве

--Объявить курсор для получения информации о столбце для указанной таблицы
ОБЪЯВИТЬ КУРСОР cursCol FAST_FORWARD ДЛЯ


- ВЫБЕРИТЕ имя_столбца, тип_данных FROM information_schema.columns ГДЕ table_name = @tableName
/* НОВЫЙ
ВЫБРАТЬ c.имя, sc.data_type FROM sys.extended_properties AS ep
ВНУТРЕННЕЕ СОЕДИНЕНИЕ sys.tables AS t ON ep.major_id = t.object_id
ВНУТРЕННЕЕ СОЕДИНЕНИЕ sys.columns КАК c ON ep.major_id = c.object_id И ep.minor_id
= c.column_id
ВНУТРЕННЕЕ СОЕДИНЕНИЕ INFORMATION_SCHEMA.COLUMNS sc ON t.name = sc.table_name и
c.name = sc.column_name
ГДЕ t.name = @tableName и c.is_identity = 0
  * /

выберите имя_объекта (c.object_id) "TABLE_NAME", c.имя "COLUMN_NAME", s.name "DATA_TYPE"
  из sys.columns c
  присоединиться к sys.systypes s на (s. xtype = c.system_type_id)
  где имя_объекта (c.object_id) в (выберите имя из sys.tables, где имя не похоже на sysdiagrams)
   И имя_объекта (c.object_id) в (выберите имя из sys.tables, где [name] = @ tableName) и c.is_identity = 0 и s.name не похоже на 'sysname'




ОТКРЫТЬ cursCol
DECLARE @string nvarchar (3000) - для хранения первой половины оператора INSERT
DECLARE @stringData nvarchar (3000) - для хранения оператора, связанного с данными (ЗНАЧЕНИЯ)
DECLARE @dataType nvarchar (1000) - типы данных, возвращаемые для соответствующих столбцов
ОБЪЯВИТЬ @IDENTITY_STRING nvarchar (100)
НАБОР @IDENTITY_STRING = ''
выберите @IDENTITY_STRING
SET @ string = 'INSERT' + @ tableName + '('
НАБОР @ stringData = ''

ОБЪЯВИТЬ @colName nvarchar (50)

ВЫБРАТЬ ДАЛЕЕ ИЗ cursCol В @tableName, @ colName, @ dataType

ЕСЛИ @@ fetch_status <> 0
 начинать
 print 'Table' + @ tableName + 'не найден, обработка пропущена.'
 закрыть curscol
 освободить curscol
 возвращаться
КОНЕЦ

ПОКА @@ FETCH_STATUS = 0
НАЧИНАТЬ
ЕСЛИ @dataType in ('varchar', 'char', 'nchar', 'nvarchar')
НАЧИНАТЬ
 --SET @ stringData = @ stringData + '' '' '' '' '+ isnull (' + @ colName + ',' '' ') +' '' '' ',' '+' '
 SET @ stringData = @ stringData + '' '' + '' '+ isnull (' '' '' + '' '' '+' + @ colName + '+' '' '+' '' '', '' NULL '') + '', '' + ''
КОНЕЦ
ЕЩЕ
if @dataType in ('text', 'ntext') - если тип данных - текст или что-то еще
НАЧИНАТЬ
 SET @ stringData = @ stringData + '' '' '' '' '+ isnull (cast (' + @ colName + 'как varchar (2000)),' '' ') +' '' '' ',' '+'
КОНЕЦ
ЕЩЕ
IF @dataType = 'money' - потому что деньги не конвертируются из varchar неявно
НАЧИНАТЬ
 SET @ stringData = @ stringData + '' 'convert (money,' '' '' '+ isnull (cast (' + @ colName + 'as varchar (200)),' '0. 0000 '') + '' '' ''), '' + '
КОНЕЦ
ЕЩЕ
ЕСЛИ @ dataType = 'datetime'
НАЧИНАТЬ
 --SET @ stringData = @ stringData + '' 'convert (datetime,' '' '' '+ isnull (cast (' + @ colName + 'as varchar (200)),' '0' ') +' '' '' '),' '+'
 --ВЫБОР 'INSERT Authorizations (StatusDate) VALUES (' + 'convert (datetime,' + isnull ('' '' + convert (varchar (200), StatusDate, 121) + '' '', 'NULL') + ' , 121),) 'ИЗ авторизаций
 --SET @ stringData = @ stringData + '' 'convert (money,' '' '' '+ isnull (cast (' + @ colName + 'as varchar (200)),' '0.0000 '') + '' '' ''), '' + '
 SET @ stringData = @ stringData + '' 'convert (datetime,' + '' '+ isnull (' '' '' + '' '' '+ convert (varchar (200),' + @ colName + ', 121) +' '' '' + '' '' ',' 'NULL' ') +' ', 121),' '+'
  - 'convert (datetime,' + isnull ('' '' + convert (varchar (200), StatusDate, 121) + '' '', 'NULL') + ', 121),)' ИЗ авторизации
КОНЕЦ
ЕЩЕ
ЕСЛИ @ dataType = 'изображение'
НАЧИНАТЬ
 SET @ stringData = @ stringData + '' '' '' '' '+ isnull (cast (convert (varbinary,' + @ colName + ') as varchar (6)),' '0' ') +' '' '' ' , '' + '
КОНЕЦ
ELSE - предположим, что тип данных - int, bit, numeric, decimal
НАЧИНАТЬ
 --SET @ stringData = @ stringData + '' '' '' '' '+ isnull (cast (' + @ colName + 'as varchar (200)),' '0' ') +' '' '' ',' '' ' + '
 --SET @ stringData = @ stringData + '' 'convert (datetime,' + '' '+ isnull (' '' '' + '' '' '+ convert (varchar (200),' + @ colName + ', 121) + '' '' '+' '' '', '' NULL '') + '', 121), '' + '
 SET @ stringData = @ stringData + '' '' + '' '+ isnull (' '' '' + '' '' '+ convert (varchar (200),' + @ colName + ') +' '' '' + ' '' '', '' NULL '') + '', '' + '
КОНЕЦ

SET @ строка = @ строка + @ colName + ','

ВЫБРАТЬ ДАЛЕЕ ИЗ cursCol В @tableName, @ colName, @ dataType
КОНЕЦ
ОБЪЯВИТЬ @Query nvarchar (4000)

НАБОР @query = 'SELECT' '' + substring (@ string, 0, len (@string)) + ') VALUES (' '+' + substring (@ stringData, 0, len (@stringData) -2) + ' '' + '') '' ОТ '+ @ имя_таблицы
exec sp_executesql @query
--select @query

ЗАКРЫТЬ cursCol
ОТКЛЮЧИТЬ cursCol


  / *

использовать poc
идти

ОБЪЯВИТЬ @RC int
ОБЪЯВИТЬ @domain_user varchar (50)
ОБЪЯВЛЕНИЕ @tableName varchar (100)

- TODO: здесь установите значения параметров. установить @ domain_user = 'yorgeorg'
установить @tableName = 'tbGui_WizardTabButtonAreas'

EXECUTE @RC = [POC]. [Dbo]. [ProcUtils_InsertGenerator]
   @domain_user
  , @ tableName

* /
ИДТИ
  

Как создать таблицу из результатов запроса в Microsoft SQL | Small Business

Дэвид Уэйн Обновлено 22 февраля 2019 г.

Если ваша компания использует реляционные базы данных для хранения данных, полезно использовать команду SQL SELECT с предложением INTO для создания новых таблиц на основе результатов запроса.Этот метод не соответствует стандарту ANSI SQL, но расширение Microsoft Transact-SQL включает эту удобную функцию. Создание новой таблицы из результатов запроса может помочь вам создать базу данных о ваших клиентах, сотрудниках, расходах и других деловых деталях, позволяя выбирать определенные столбцы из существующих таблиц. Эта стратегия помогает вам управлять взаимосвязанными таблицами в вашей базе данных.

Запустите инструмент запросов SQL Server

Нажмите кнопку Запустить и запустите Microsoft SQL Server Management Studio. Щелкните меню Server Name и выберите свой сервер из раскрывающегося списка. Щелкните Connect .

Создание запроса SELECT INTO

Щелкните правой кнопкой мыши базу данных в обозревателе объектов в левой части экрана. Щелкните Новый запрос в контекстном меню. В окне запроса введите следующий оператор:

SELECT client_id, first_name, last_name INTO new_table FROM old_table; GO

Замените «new_table» именем создаваемой таблицы, а «old_table» — именем таблицы, из которой нужно выбрать.Предложение INTO ведет себя так же, как CREATE TABLE в других средах SQL.

Уточните свой запрос

Введите следующие строки в окне запроса, чтобы уточнить результаты запроса:

SELECT * INTO new_table FROM old_table WHERE last_name LIKE ‘Ja%’; GO

Ключевое слово LIKE позволяет фильтровать результаты на основе выражения с подстановочными знаками. В этом примере Transact-SQL создаст новую таблицу со всеми столбцами из строк в «old_table», в которой фамилия начинается с «Ja.”

Экспериментируйте с выбором подстановочных знаков

Обведите текстовый образец символами«% », чтобы он соответствовал тексту в середине слов. Например, используйте следующее предложение WHERE в своем операторе SELECT:

WHERE last_name LIKE ‘% ta%’

В этом примере будут возвращены все совпадения, содержащие шаблон «ta» в середине слова.

SELECT INTO с UNION

Создайте новую таблицу из результатов двух отдельных запросов с ключевым словом UNION.Создайте оператор SELECT, подобный следующему в окне запроса:

SELECT last_name, адрес INTO new_table FROM old_table_a, WHERE address NOT LIKE ‘% Los Angeles%’ UNION SELECT last_name, address FROM old_table_b WHERE address NOT LIKE ‘% Los Angeles%’ ; GO

Вам не нужно включать предложение INTO в оба оператора SELECT. Просто объедините два оператора SELECT с ключевым словом UNION, чтобы объединить результаты двух запросов в новую таблицу.

Tip

При работе с базами данных, отличными от Microsoft SQL Server, проверьте руководство, чтобы узнать, поддерживает ли оно SELECT INTO.Он может поддерживать синтаксис или использовать другой способ выполнения той же задачи.

Создание таблицы с SQL Server 2019

SQL Server от Microsoft поддерживает несколько различных методов создания новых таблиц в базе данных. Многие разработчики баз данных предпочитают вручную создавать сценарии операторов SQL, которые создают такие объекты, но более простой метод основан на инструментах графического интерфейса пользователя в SQL Server Management Studio.

Процедуры, описанные ниже, регулируют Microsoft SQL Server Management Studio 2019, хотя процедуры аналогичны для версий, начиная с 2012 года.

Как создать таблицу с помощью SSMS

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

  1. В SMSS в обозревателе объектов разверните дерево соответствующей базы данных. В узле Tables щелкните его правой кнопкой мыши и выберите New > Table .

    Lifewire
  2. На экране «Новая таблица» введите информационную сетку:

    • Имя столбца : Предложите уникальное имя для поля.
    • Тип данных : выберите из раскрывающегося списка тип информации, содержащейся в поле. Ознакомьтесь с документацией Microsoft, чтобы получить полное представление об этих вариантах.
    • Разрешить пустые значения : Отметьте этот столбец, если столбец может оставаться пустым.
  3. По мере заполнения каждого столбца в списке измените свойства деталей на панели в нижней половине окна. В общем, наиболее распространенные свойства, которые вы изменяете, — это длина , (максимально допустимый размер поля) и описание , (определение предполагаемого назначения поля на простом английском языке).

  4. Используйте меню конструктора таблиц или щелкните правой кнопкой мыши определенный столбец в конструкторе таблиц, чтобы уточнить таблицу. Общие параметры меню включают:

    • Установить первичный ключ : Переключает, составляет ли столбец уникальное значение ключа для таблицы.
    • Вставить столбец : добавить новый столбец в таблицу.
    • Удалить столбец : удалить столбец из таблицы.
    • Отношения : Устанавливает связь внешнего ключа с другой таблицей.
    • Индексы / ключи : Устанавливает уникальные свойства или индекс для столбца.
    • Проверить ограничения : Устанавливает правила, регулирующие допустимые значения для поля. Если значение не попадает в ограничения, запись не сохраняется.
  5. Нажмите Ctrl + S, чтобы сохранить таблицу. Вам будет предложено предложить имя для стола.

Создание таблиц с помощью T-SQL

T-SQL от Microsoft поддерживает возможность языка определения данных для создания, удаления или изменения объектов. Если вы не слишком хорошо знакомы с SQL, придерживайтесь визуального редактора в SSMS.

Спасибо, что сообщили нам!

Расскажите, почему!

Другой Недостаточно деталей Сложно понять

SQL Server CREATE TABLE Заявление

В этом учебном руководстве по SQL объясняется, как использовать CREATE TABLE оператор в SQL Server. Это руководство является первой частью из двух сообщений, описывающих операторы DDL (языка определения данных) в SQL Server.

Операторы DDL — это подмножество операторов SQL, используемых для создания, изменения или удаления структур базы данных.В этом посте вы узнаете, как создавать и удалять таблицы.

Этот учебник позволяет вам ознакомиться со следующими темами:

В следующем посте будет описано, как использовать оператор SQL Server ALTER TABLE.



SQL Server CREATE TABLE Заявление

Оператор CREATE TABLE SQL Server используется для создания новых таблиц в базе данных.



Типы данных

Тип колонны Описание Пример
VARCHAR ( размер ) Строковый столбец.Значение в скобках указывает максимальный размер каждого поля в столбце (в символах) VARCHAR (3) → «ABC»

VARCHAR (3) → «AB»

Десятичный (p, s) Числовой столбец. P recision — количество цифр, S cale — сколько цифр находится после десятичной точки ДЕСЯТИЧНЫЙ (5,2) → 476,29

ДЕСЯТИЧНАЯ (5,2) → 6,29

ДАТА Столбец формата даты «ГГГГ-ММ-ДД»


Значение по умолчанию для SQL Server

Столбцу можно присвоить значение по умолчанию с помощью ключевого слова DEFAULT. Ключевое слово DEFAULT предоставляет значение по умолчанию для столбца, когда инструкция SQL Server INSERT INTO не предоставляет конкретного значения. Значение по умолчанию может быть буквальным значением, выражением или функцией SQL, например GETDATE ().

Чтобы определить значение по умолчанию, используйте этот синтаксис:

ПО УМОЛЧАНИЮ default_value
 

Например:

СОЗДАТЬ ТАБЛИЦУ demo_tbl
(
зарплата DECIMAL (8,2) ПО УМОЛЧАНИЮ 9500,
rental_date ДАТА ПО УМОЛЧАНИЮ ’27.01.2011’,
дата рождения ДАТА ПО УМОЛЧАНИЮ GETDATE ()
)

ВСТАВИТЬ demo_tbl
ЗНАЧЕНИЯ (ПО УМОЛЧАНИЮ, ПО УМОЛЧАНИЮ, ПО УМОЛЧАНИЮ)

ВЫБРАТЬ *
ОТ demo_tbl

зарплата наем_дата дата рождения
------ --------- ----------
9500 2011-01-27 2014-01-13
 


Создание ограничений SQL Server

Ограничения применяют правила к данным в таблице всякий раз, когда строка вставляется, удаляется или обновляется.Ограничения могут быть определены на уровне столбца или таблицы.

Определение ограничений на уровне столбца

Ограничение на уровне столбца:

  • Создается как часть определения столбца
  • Всегда относится к одной колонке
  • Ограничение на уровне столбца имеет следующую структуру:
CONSTRAINT имя_ограничения тип_ограничения
 
  • Constraint_type — тип ограничения, которое должно применяться к столбцу (например, Unique или Not Null)
  • Constraint_name — хотя и не является обязательным, всегда рекомендуется давать ограничению имя, что позволит вам легко идентифицировать его.

Многие разработчики баз данных обычно используют следующее соглашение об именах:

<имя таблицы> _ <имя_столбца> _ <аббревиатура ограничения>

Например:



Первичный ключ (PK)

В SQL Server ограничение первичного ключа — это столбец (или набор столбцов), который однозначно идентифицирует каждую строку в таблице, это ограничение обеспечивает уникальность и гарантирует, что ни один столбец, являющийся частью первичного ключа, не может содержать значение NULL. Для каждой таблицы можно создать только один первичный ключ.

Синтаксис определения ограничения первичного ключа следующий:

имя_столбца тип_данных_столбца [значение ПО УМОЛЧАНИЮ] [имя_ограничения CONSTRAINT] ПЕРВИЧНЫЙ КЛЮЧ,
 

Например:

СОЗДАТЬ ТАБЛИЦЫ emps
(emp_id decimal (3) CONSTRAINT emps_empid_pk PRIMARY KEY,
 emp_name varchar (25))
 

Обратите внимание — квадратные скобки в этой демонстрации (и в последующих) указывают на то, что заключенное в них необязательно, квадратные скобки не являются частью оператора CREATE TABLE.


Не ноль (NN)

В SQL Server ограничение Not Null гарантирует, что столбец не содержит значений NULL. Синтаксис для определения ограничения Not Null следующий:

имя_столбца тип_данных_столбца [значение ПО УМОЛЧАНИЮ] [CONSTRAINT имя_ограничения] NOT NULL,
 

Например:

СОЗДАТЬ ТАБЛИЦЫ emps
(emp_id decimal (3) CONSTRAINT emps_empid_pk PRIMARY KEY,
 emp_name varchar (25) CONSTRAINT emps_emnm_nn NOT NULL)
 

Это ограничение можно определить только на уровне столбца

УНИКАЛЬНЫЙ (UQ)

В SQL Server ограничение уникальности требует, чтобы каждое значение в столбце (или наборе столбцов) было уникальным. Синтаксис для определения ограничения UNIQUE следующий:

имя_столбца тип_данных_столбца [значение ПО УМОЛЧАНИЮ] [имя_ограничения CONSTRAINT] UNIQUE,
 

Например:

СОЗДАТЬ ТАБЛИЦЫ emps
(emp_id decimal (3) CONSTRAINT emps_empid_pk PRIMARY KEY,
 emp_name varchar (25) CONSTRAINT emps_emnm_nn NOT NULL,
 emp_phone varchar (25) ОГРАНИЧЕНИЕ emps_empn_uq УНИКАЛЬНО)
 


ПРОВЕРКА (СК)

В SQL Server ограничение Check определяет условие, которому должна удовлетворять каждая строка.Синтаксис для определения ограничения проверки следующий:

имя_столбца тип_данных_столбца [значение ПО УМОЛЧАНИЮ] [CONSTRAINT имя_ограничения] ПРОВЕРКА (условие),
 
  • Условие, записанное в CHECK, очень похоже по своей структуре на каждое из условий, записанных в операторе WHERE.
  • Условие в части CHECK не должно включать:
    • Значения, возвращаемые в результате использования SEQUENCES
    • Такие функции, как GETDATE ()
    • Подзапросы

Например:

СОЗДАТЬ ТАБЛИЦЫ emps
(emp_id decimal (3) CONSTRAINT emps_empid_pk PRIMARY KEY,
 emp_name varchar (25) CONSTRAINT emps_emnm_nn NOT NULL,
 emp_phone varchar (25) ОГРАНИЧЕНИЕ emps_empn_uq УНИКАЛЬНО,
 emp_mail varchar (25) CONSTRAINT emps_emml_ck CHECK (emp_mail LIKE _% @%. % '))
 

Другой пример:

СОЗДАТЬ ТАБЛИЦЫ emps
(emp_id decimal (3) CONSTRAINT emps_empid_pk PRIMARY KEY,
 emp_name varchar (25) CONSTRAINT emps_emnm_nn NOT NULL,
 emp_phone varchar (25) ОГРАНИЧЕНИЕ emps_empn_uq УНИКАЛЬНО,
 emp_mail varchar (25) CONSTRAINT emps_emml_ck CHECK (emp_mail LIKE '_%@%.%'),
 emp_sal decimal (8,2) CONSTRAINT emp_sal_ck CHECK (emp_sal & amp; amp; amp; lt; & amp; amp; amp; gt; 5000))
 


ИНОСТРАННЫЙ КЛЮЧ (FK)

В SQL Server ограничение внешнего ключа обозначает столбец (или набор столбцов) как внешний ключ и устанавливает связь между первичным ключом (или уникальным) в другой таблице (или в той же таблице).Синтаксис для определения ограничения проверки следующий:

имя_столбца… [CONSTRAINT имя_ограничения] ССЫЛКИ имя_таблицы (имя_столбца) [ON DELETE CASCADE] [ON DELETE SET NULL]
 

Пример:

Родительский стол

СОЗДАТЬ ТАБЛИЦУ deps
(dep_id decimal (3) CONSTRAINT deps_id_pk PRIMARY KEY,
 имя_использования varchar (25))
 

Детский стол

СОЗДАТЬ ТАБЛИЦЫ emps
(emp_id decimal (3) CONSTRAINT emps_empid_pk PRIMARY KEY,
 emp_name varchar2 (25) CONSTRAINT emps_emnm_nn NOT NULL,
 emp_phone varchar2 (25) ОГРАНИЧЕНИЕ emps_empn_uq УНИКАЛЬНО,
 emp_mail varchar2 (25) CONSTRAINT emps_emml_ck CHECK (emp_mail LIKE '_% @%. % '),
 emp_sal decimal (8,2) CONSTRAINT emp_sal_ck CHECK (emp_sal & amp; amp; gt; 5000),
 dep_id decimal (3) CONSTRAINT emp_depid_fk ССЫЛКИ deps (dep_id))
 


Ограничения уровня таблицы

  • Создается после определения различных столбцов.
  • Может относиться к более чем одному столбцу (ограничение, состоящее из двух столбцов вместе).
  • Позволяет создать несколько ограничений для одного столбца.
  • Невозможно создать ограничение NOT NULL с помощью этого метода.

Например:

СОЗДАТЬ ТАБЛИЦЫ emps
(emp_id DECIMAL (3),
 emp_f_name VARCHAR (25),
 emp_l_name VARCHAR (25),
 emp_phone VARCHAR (25) CONSTRAINT emps_empn_nn NOT NULL,
 emp_mail VARCHAR (25),
 emp_sal DECIMAL (8,2),
 dep_id DECIMAL (3),
 ОГРАНИЧЕНИЕ emps_empid_pk ПЕРВИЧНЫЙ КЛЮЧ (emp_id),
 ОГРАНИЧЕНИЕ emps_empn_uq UNIQUE (emp_f_name, emp_l_name),
 CONSTRAINT emps_emml_ck1 CHECK (emp_mail LIKE '_%@%.%'),
 CONSTRAINT emps_emml_ck2 CHECK (LENGTH (emp_mail) & amp; amp; gt; 15),
 ОГРАНИЧЕНИЕ emps_emml_uq UNIQUE (emp_mail),
 ОГРАНИЧИТЕЛЬНАЯ ПРОВЕРКА emp_sal_ck (emp_sal & amp; amp; gt; 5000),
 ОГРАНИЧЕНИЕ emp_depid_fk ИНОСТРАННЫЙ КЛЮЧ (dep_id)
 ССЫЛКИ deps (dep_id))
 


Удалить существующую таблицу

Синтаксис, используемый для удаления существующей таблицы в SQL Server, следующий:

DROP TABLE имя_таблицы
 

Например,

DROP TABLE сотрудники
 

Создание временной таблицы на основе другой таблицы в SQL Server

В SQL Server вы можете создать временную таблицу на основе другой таблицы, используя команду SELECT. .. INTO синтаксис.

Вы можете создать таблицу с данными или без них. Другими словами, вы можете скопировать данные из исходной таблицы, если хотите, или вы можете создать таблицу без каких-либо данных.

Пример 1 — Создание таблицы с данными

Вот пример создания временной таблицы на основе постоянной таблицы и копирования всех данных в процессе.

ИСПОЛЬЗОВАНИЕ Test;
ВЫБРАТЬ
  CatId,
  CatName,
  Телефон
В #TempCatsAllData
ОТ dbo.Кошки;
 

Давайте посмотрим на результат.

ВЫБРАТЬ * ИЗ #TempCatsAllData;
 

Результат:

+ --------- + ----------- + ------------ +
| CatId | CatName | Телефон |
| --------- + ----------- + ------------ |
| 1 | Гарфилд | 9871237654 |
| 2 | Феликс | 8871237651 |
| 3 | Том | 7871237652 |
| 4 | Получить | 6871237653 |
+ --------- + ----------- + ------------ +
 

Вы также можете отфильтровать данные с помощью предложения WHERE , если вам нужно.

Пример 2 — Создание таблицы без данных

Вот пример создания таблицы без данных.

ИСПОЛЬЗОВАНИЕ Test;
ВЫБРАТЬ
  CatId,
  CatName,
  Телефон
В #TempCatsNoData
ОТ dbo.Cats
ГДЕ 1 = 0;
 

В этом примере я использую WHERE 1 = 0 , чтобы не возвращать данные.

Пример 3 — Проверьте таблицы

В этом примере я сравниваю две временные таблицы с исходной таблицей. Я делаю это, запрашивая файл sys.столбцы представляют каталог в исходной базе данных (для исходной таблицы) и в базе данных tempdb (для временных таблиц).

ИСПОЛЬЗОВАНИЕ Test;
ВЫБРАТЬ
  имя AS [Название столбца],
  TYPE_NAME (user_type_id) AS [Тип данных],
  максимальная длина,
  [точность],
  шкала,
  is_nullable
ИЗ sys.columns
ГДЕ OBJECT_NAME (object_id) = 'Кошки';

USE tempdb;
ВЫБРАТЬ
  назовите AS [Имя столбца],
  TYPE_NAME (user_type_id) AS [Тип данных],
  максимальная длина,
  [точность],
  шкала,
  is_nullable
ОТ sys. столбцы
ГДЕ ИМЯ ОБЪЕКТА (идентификатор_объекта) LIKE '# TempCatsAllData%';

ВЫБРАТЬ
  назовите AS [Имя столбца],
  TYPE_NAME (user_type_id) AS [Тип данных],
  максимальная длина,
  [точность],
  шкала,
  is_nullable
ИЗ sys.columns
ГДЕ OBJECT_NAME (object_id) LIKE '# TempCatsNoData%';
 

Результат:

Изменен контекст базы данных на «Тест».
+ --------------- + ------------- + -------------- + ---- --------- + --------- + --------------- +
| Имя столбца | Тип данных | max_length | точность | масштаб | is_nullable |
| --------------- + ------------- + -------------- + ---- --------- + --------- + --------------- |
| CatId | int | 4 | 10 | 0 | 0 |
| CatName | varchar | 70 | 0 | 0 | 1 |
| Телефон | varchar | 10 | 0 | 0 | 1 |
+ --------------- + ------------- + -------------- + ---- --------- + --------- + --------------- +
(Затронуты 3 ряда)
Изменен контекст базы данных на tempdb.+ --------------- + ------------- + -------------- + ---- --------- + --------- + --------------- +
| Имя столбца | Тип данных | max_length | точность | масштаб | is_nullable |
| --------------- + ------------- + -------------- + ---- --------- + --------- + --------------- |
| CatId | int | 4 | 10 | 0 | 0 |
| CatName | varchar | 70 | 0 | 0 | 1 |
| Телефон | varchar | 10 | 0 | 0 | 1 |
+ --------------- + ------------- + -------------- + ---- --------- + --------- + --------------- +
(Затронуты 3 ряда)
+ --------------- + ------------- + -------------- + ---- --------- + --------- + --------------- +
| Имя столбца | Тип данных | max_length | точность | масштаб | is_nullable |
| --------------- + ------------- + -------------- + ---- --------- + --------- + --------------- |
| CatId | int | 4 | 10 | 0 | 0 |
| CatName | varchar | 70 | 0 | 0 | 1 |
| Телефон | varchar | 10 | 0 | 0 | 1 |
+ --------------- + ------------- + -------------- + ---- --------- + --------- + --------------- +
(Затронуты 3 ряда)
 

sql server — скопируйте полную структуру таблицы

Я написал этот sp для автоматического создания схемы со всеми вещами, pk, fk, разделами, ограничениями. ..

ВАЖНО !! перед запуском

  создать тип TestTableType как таблицу (ObjectID int)
  

здесь СП:

  УСТАНОВИТЬ ANSI_NULLS ON
ИДТИ
ВКЛЮЧИТЬ QUOTED_IDENTIFIER
ИДТИ


    - *********************************************** ************************************************ '
- Процедура создания скрипта для табеллы
- Табелла: ххххх
- Creata da: Э. Мантованелли
- Дата создания: 28-06-2012
- Изменение данных: 28-06-2012
- *********************************************** ************************************************ '

/ *
    - ID ---- | ----- Данные ----- | - Пользователь --------- | ----  Примечание
                        20-11-2013 Э.Mantovanelli Differences schema delle tabelle
                                                                        estrazione da db selezionato
                                                                        agiunta estrazione partizione
* /

СОЗДАТЬ ПРОЦЕДУРУ [dbo]. [Util_ScriptTable]
     @DBName SYSNAME
    , @ sysname схемы
    , @ Имя таблицы SYSNAME
    , @ IncludeConstraints BIT = 1
    , @ IncludeIndexes BIT = 1
    , @ NewTableSchema sysname
    , @ NewTableName SYSNAME = NULL
    , @ UseSystemDataTypes BIT = 0
    , @ script varchar (max) вывод
В КАЧЕСТВЕ
НАЧАТЬ попробовать
    если не существует (выберите * из sys. типы, где name = 'TestTableType')
        создать тип TestTableType как таблицу (ObjectID int) - тип отбрасывания TestTableType

    объявить @sql nvarchar (max)

    ОБЪЯВЛЕНИЕ ТАБЛИЦЫ @MainDefinition (FieldValue VARCHAR (200))
    --DECLARE @DBName SYSNAME
    ОБЪЯВИТЬ @ClusteredPK BIT
    ОБЪЯВИТЬ @TableSchema NVARCHAR (255)

    --SET @DBName = DB_NAME (DB_ID ())
    ВЫБЕРИТЕ @TableName = имя ИЗ sysobjects ГДЕ id = OBJECT_ID (@TableName)

    ОБЪЯВЛЕНИЕ ТАБЛИЦЫ @ShowFields (FieldID INT IDENTITY (1,1)
                                        , DatabaseName VARCHAR (100)
                                        , TableOwner VARCHAR (100)
                                        , TableName VARCHAR (100)
                                        , FieldName VARCHAR (100)
                                        , ColumnPosition INT
                                        , ColumnDefaultValue VARCHAR (100)
                                        , ColumnDefaultName VARCHAR (100)
                                        , IsNullable BIT
                                        , Тип данных VARCHAR (100)
                                        , MaxLength varchar (10)
                                        , NumericPrecision INT
                                        , NumericScale INT
                                        , Имя домена VARCHAR (100)
                                        , FieldListingName VARCHAR (110)
                                        , FieldDefinition CHAR (1)
                                        , IdentityColumn BIT
                                        , IdentitySeed INT
                                        , IdentityIncrement INT
                                        , IsCharColumn BIT
                                        , IsComputed varchar (255))

    ОБЪЯВЛЕНИЕ ТАБЛИЦЫ @HoldingArea (FldID SMALLINT IDENTITY (1,1)
                                        , Поля VARCHAR (4000)
                                        , FldValue CHAR (1) ПО УМОЛЧАНИЮ (0))

    ОБЪЯВЛЕНИЕ ТАБЛИЦЫ @PKObjectID (ObjectID INT)

    ОБЪЯВЛЕНИЕ ТАБЛИЦЫ @Uniques (ObjectID INT)

    ОБЪЯВЛЕНИЕ ТАБЛИЦЫ @HoldingAreaValues ​​(FldID SMALLINT IDENTITY (1,1)
                                                , Поля VARCHAR (4000)
                                                , FldValue CHAR (1) ПО УМОЛЧАНИЮ (0))

    DECLARE @Definition TABLE (DefinitionID SMALLINT IDENTITY (1,1)
                                        , FieldValue VARCHAR (200))


  установить @ sql =
  '
  используйте '+ @ DBName +'
  ВЫБЕРИТЕ отдельную БД ИМЯ ()
            , TABLE_SCHEMA
            , TABLE_NAME
            , '' ['' + COLUMN_NAME + ''] '' как COLUMN_NAME
            , CAST (ORDINAL_POSITION AS INT)
            , COLUMN_DEFAULT
            , добж. имя как ColumnDefaultName
            , СЛУЧАЙ, КОГДА c.IS_NULLABLE = '' YES '' ТОГДА 1 ELSE 0 END
            ,ТИП ДАННЫХ
            , случай CHARACTER_MAXIMUM_LENGTH, когда -1, затем '' max '' иначе CAST (CHARACTER_MAXIMUM_LENGTH AS varchar) end - CAST (CHARACTER_MAXIMUM_LENGTH AS INT)
            , CAST (NUMERIC_PRECISION AS INT)
            , CAST (NUMERIC_SCALE AS INT)
            ,ДОМЕННОЕ ИМЯ
            , COLUMN_NAME + '', ''
            , '' '' Определение поля AS
            , СЛУЧАЙ, КОГДА ic.object_id ЕСТЬ NULL THEN 0 ELSE 1 END AS IdentityColumn
            , CAST (ISNULL (ic.seed_value, 0) КАК INT) КАК IdentitySeed
            , CAST (ISNULL (ic.increment_value, 0) AS INT) AS IdentityIncrement
            , СЛУЧАЙ, КОГДА st.collation_name НЕ NULL THEN 1 ELSE 0 END AS IsCharColumn
            , cc.definition
            ИЗ INFORMATION_SCHEMA.COLUMNS c
            ПРИСОЕДИНЯЙТЕСЬ к sys.columns sc ON c.TABLE_NAME = OBJECT_NAME (sc.object_id) AND c.COLUMN_NAME = sc.Name
            LEFT JOIN sys. identity_columns ic ON c.TABLE_NAME = OBJECT_NAME (ic.object_id) AND c.COLUMN_NAME = ic.Name
            ПРИСОЕДИНЯЙТЕСЬ к sys.типы st ON COALESCE (c.DOMAIN_NAME, c.DATA_TYPE) = st.name
            ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ sys.objects dobj ON dobj.object_id = sc.default_object_id И dobj.type = '' D ''
            left join sys.computed_columns cc на c.TABLE_NAME = OBJECT_NAME (cc.object_id) и sc.column_id = cc.column_id
    ГДЕ c.TABLE_NAME = @TableName и c.TABLE_SCHEMA=@schema
    ORDER BY c.TABLE_NAME, c.ORDINAL_POSITION
    '

  печать @sql
  ВСТАВИТЬ @ShowFields (DatabaseName
                                    , TableOwner
                                    , TableName
                                    , FieldName
                                    , ColumnPosition
                                    , ColumnDefaultValue
                                    , ColumnDefaultName
                                    , IsNullable
                                    ,Тип данных
                                    ,Максимальная длина
                                    , NumericPrecision
                                    , NumericScale
                                    ,Доменное имя
                                    , FieldListingName
                                    , FieldDefinition
                                    , IdentityColumn
                                    , IdentitySeed
                                    , IdentityIncrement
                                    , IsCharColumn
                                    , IsComputed)

    exec sp_executesql @sql,
                       N '@ TableName varchar (50), @ schema varchar (50)',
                       @ TableName = @ TableName, @ schema = @ schema
    / *
    ВЫБЕРИТЕ @ DBName - DB_NAME ()
            , TABLE_SCHEMA
            , TABLE_NAME
            , COLUMN_NAME
            , CAST (ORDINAL_POSITION AS INT)
            , COLUMN_DEFAULT
            , добж. имя как ColumnDefaultName
            , СЛУЧАЙ, КОГДА c.IS_NULLABLE = 'YES' THEN 1 ELSE 0 END
            ,ТИП ДАННЫХ
            , CAST (CHARACTER_MAXIMUM_LENGTH AS INT)
            , CAST (NUMERIC_PRECISION AS INT)
            , CAST (NUMERIC_SCALE AS INT)
            ,ДОМЕННОЕ ИМЯ
            , COLUMN_NAME + ','
            , '' AS FieldDefinition
            , СЛУЧАЙ, КОГДА ic.object_id ЕСТЬ NULL THEN 0 ELSE 1 END AS IdentityColumn
            , CAST (ISNULL (ic.seed_value, 0) AS INT) AS IdentitySeed
            , CAST (ISNULL (ic.инкремент_значение, 0) КАК INT) КАК IdentityIncrement
            , СЛУЧАЙ, КОГДА st.collation_name НЕ NULL THEN 1 ELSE 0 END AS IsCharColumn
            ИЗ INFORMATION_SCHEMA.COLUMNS c
            ПРИСОЕДИНЯЙТЕСЬ к sys.columns sc ON c.TABLE_NAME = OBJECT_NAME (sc.object_id) AND c.COLUMN_NAME = sc.Name
            LEFT JOIN sys.identity_columns ic ON c.TABLE_NAME = OBJECT_NAME (ic.object_id) AND c.COLUMN_NAME = ic.Name
            ПРИСОЕДИНЯЙТЕСЬ к sys.types st ON COALESCE (c. DOMAIN_NAME, c.DATA_TYPE) = st.name
            LEFT OUTER JOIN sys.объекты dobj ON dobj.object_id = sc.default_object_id AND dobj.type = 'D'

    ГДЕ c.TABLE_NAME = @TableName
    ORDER BY c.TABLE_NAME, c.ORDINAL_POSITION
    * /
    ВЫБЕРИТЕ ТОП 1 @TableSchema = TableOwner ИЗ @ShowFields

    ВСТАВИТЬ ЗНАЧЕНИЯ @HoldingArea (Flds) ('(')

    INSERT INTO @Definition (FieldValue) VALUES ('CREATE TABLE' + CASE WHEN @NewTableName IS NOT NULL THEN @DBName + '.' + @NewTableSchema + '.' + @NewTableName ELSE @DBName + '.' + @TableSchema + ' . '+ @TableName END)
    INSERT INTO @Definition (FieldValue) VALUES ('(')
    ВСТАВИТЬ В @ Определение (FieldValue)
    ВЫБРАТЬ СИМВОЛ (10) + Имя поля + '' +
        --CASE WHEN DomainName IS NOT NULL AND @UseSystemDataTypes = 0 THEN DomainName + CASE WHEN IsNullable = 1 THEN 'NULL' ELSE 'NOT NULL' END ELSE UPPER (DataType) + CASE WHEN IsCharColumn = 1 THEN '(' + CAST (MaxLength) AS VARCHAR (10)) + ')' ELSE 'END + CASE WHEN IdentityColumn = 1 THEN' IDENTITY ('+ CAST (IdentitySeed AS VARCHAR (5)) +', '+ CAST (IdentityIncrement AS VARCHAR (5)) + ')' ELSE '' END + CASE WHEN IsNullable = 1 THEN 'NULL' ELSE 'NOT NULL' END + CASE WHEN ColumnDefaultName NOT NULL AND @IncludeConstraints = 1 THEN 'CONSTRAINT [' + ColumnDefaultName + '] DEFAULT' + UPPER ( ColumnDefaultValue) ELSE '' END END + CASE WHEN FieldID = (SELECT MAX (FieldID) FROM @ShowFields) THEN '' ELSE ',' END

        СЛУЧАЙ, КОГДА DomainName НЕ ЯВЛЯЕТСЯ NULL И @UseSystemDataTypes = 0 ТОГДА DomainName +
            CASe WHEN IsNullable = 1 THEN 'NULL'
            ИНАЧЕ 'NOT NULL'
            КОНЕЦ
        ЕЩЕ
            случай, когда IsComputed имеет значение null, тогда
                ВЕРХНИЙ (Тип данных) +
                СЛУЧАЙ, КОГДА IsCharColumn = 1 THEN '(' + CAST (MaxLength AS VARCHAR (10)) + ')'
                ЕЩЕ
                    ВАРИАНТ, КОГДА DataType = 'numeric' THEN '(' + CAST (NumericPrecision AS VARCHAR (10)) + ',' + CAST (NumericScale AS VARCHAR (10)) + ')'
                    ЕЩЕ
                        СЛУЧАЙ, КОГДА DataType = 'decimal' THEN '(' + CAST (NumericPrecision AS VARCHAR (10)) + ',' + CAST (NumericScale AS VARCHAR (10)) + ')'
                        ЕЩЕ ''
                        конец
                    конец
                КОНЕЦ +
                СЛУЧАЙ, КОГДА IdentityColumn = 1 THEN 'IDENTITY (' + CAST (IdentitySeed AS VARCHAR (5)) + ',' + CAST (IdentityIncrement AS VARCHAR (5)) + ')'
                ЕЩЕ ''
                КОНЕЦ +
                CASE WHEN IsNullable = 1 THEN 'NULL'
                ИНАЧЕ 'NOT NULL'
                КОНЕЦ +
                СЛУЧАЙ, КОГДА ColumnDefaultName НЕ ЯВЛЯЕТСЯ NULL И @IncludeConstraints = 1 THEN 'CONSTRAINT [' + replace (ColumnDefaultName, @ TableName, @ NewTableName) + '] DEFAULT' + UPPER (ColumnDefaultValue)
                ЕЩЕ ''
                КОНЕЦ
            еще
                'как' + IsComputed + ''
            конец
        КОНЕЦ +
        СЛУЧАЙ, КОГДА FieldID = (SELECT MAX (FieldID) FROM @ShowFields) THEN ''
        ЕЩЕ ','
        КОНЕЦ

    ОТ @ShowFields

    ЕСЛИ @IncludeConstraints = 1
        НАЧИНАТЬ

        установить @ sql =
        '
        используйте '+ @ DBName +'
        ВЫБЕРИТЕ отдельный '', ОГРАНИЧЕНИЕ ['' + replace (name, @ TableName, @ NewTableName) + ''] FOREIGN KEY ('' + ParentColumns + '') REFERENCES ['' + ReferencedObject + ''] ('' + ReferencedColumns + '') ''
           FROM (SELECT ReferencedObject = OBJECT_NAME (fk. referenced_object_id), ParentObject = OBJECT_NAME (parent_object_id), fk.name
                , REVERSE (SUBSTRING (REVERSE ((SELECT cp.name + '', ''
                ОТ sys.foreign_key_columns fkc
                ПРИСОЕДИНЯЙТЕСЬ к sys.columns cp ON fkc.parent_object_id = cp.object_id AND fkc.parent_column_id = cp.column_id
                ГДЕ fkc.constraint_object_id = fk.object_id ДЛЯ ПУТИ XML ('' ''))), 2, 8000)) ParentColumns,
                REVERSE (SUBSTRING (REVERSE ((SELECT cr.name + '', ''
                ОТ sys.foreign_key_columns fkc
                ПРИСОЕДИНЯЙТЕСЬ к sys.columns cr ON fkc.referenced_object_id = cr.object_id AND fkc.referenced_column_id = cr.column_id
                ГДЕ fkc.constraint_object_id = fk.object_id ДЛЯ ПУТИ XML ('' ''))), 2, 8000)) ReferencedColumns
                ОТ sys.foreign_keys fk
                    внутреннее соединение sys.schemas s на fk.schema_id = s.schema_id и s.name=@schema) a
            ГДЕ ParentObject = @TableName
        '

        печать @sql

        ВСТАВИТЬ В @ Определение (FieldValue)
        exec sp_executesql @sql,
                   N '@ TableName varchar (50), @ NewTableName varchar (50), @ schema varchar (50)',
                       @ TableName = @ TableName, @ NewTableName = @ NewTableName, @ schema = @ schema
            / *
           SELECT ', CONSTRAINT [' + name + '] FOREIGN KEY (' + ParentColumns + ') REFERENCES [' + ReferencedObject + '] (' + ReferencedColumns + ')'
           FROM (SELECT ReferencedObject = OBJECT_NAME (fk. referenced_object_id), ParentObject = OBJECT_NAME (parent_object_id), fk.name
                , REVERSE (SUBSTRING (REVERSE ((SELECT cp.name + ','
                ОТ sys.foreign_key_columns fkc
                ПРИСОЕДИНЯЙТЕСЬ к sys.columns cp ON fkc.parent_object_id = cp.object_id AND fkc.parent_column_id = cp.column_id
                ГДЕ fkc.constraint_object_id = fk.object_id ДЛЯ ПУТИ XML (''))), 2, 8000)) ParentColumns,
                REVERSE (SUBSTRING (REVERSE ((SELECT cr.name + ','
                ОТ sys.foreign_key_columns fkc
                ПРИСОЕДИНЯЙТЕСЬ к sys.columns cr ON fkc.referenced_object_id = cr.object_id AND fkc.referenced_column_id = cr.column_id
                ГДЕ fkc.constraint_object_id = fk.object_id ДЛЯ ПУТИ XML (''))), 2, 8000)) ReferencedColumns
                ОТ sys.foreign_keys fk) a
            ГДЕ ParentObject = @TableName
            * /

            установить @ sql =
            '
            используйте '+ @ DBName +'
            ВЫБЕРИТЕ отдельный '', ОГРАНИЧЕНИЕ ['' + replace (c. name, @ TableName, @ NewTableName) + ''] CHECK '' + определение
            FROM sys.check_constraints c присоединиться к sys.schemas s на c.schema_id = s.schema_id и s.name=@schema
            ГДЕ ИМЯ ОБЪЕКТА (parent_object_id) = @TableName
            '

            печать @sql
            ВСТАВИТЬ В @ Определение (FieldValue)
            exec sp_executesql @sql,
                               N '@ TableName varchar (50), @ NewTableName varchar (50), @ schema varchar (50)',
                       @ TableName = @ TableName, @ NewTableName = @ NewTableName, @ schema = @ schema
            / *
            SELECT ', CONSTRAINT [' + name + '] CHECK' + определение FROM sys.check_constraints
            ГДЕ ИМЯ ОБЪЕКТА (parent_object_id) = @TableName
            * /

            установить @ sql =
            '
            используйте '+ @ DBName +'
            ВЫБЕРИТЕ РАЗЛИЧНЫЙ PKObject = cco.object_id
            ОТ sys.key_constraints cco
            ПРИСОЕДИНЯЙТЕСЬ к sys.index_columns cc ON cco. parent_object_id = cc.object_id И cco.unique_index_id = cc.index_id
            ПРИСОЕДИНЯЙТЕСЬ к sys.indexes i ON cc.object_id = i.object_id И cc.index_id = i.index_id
            Присоединяйтесь к sys.schemas в cco.schema_id = s.schema_id и s.name=@schema
            ГДЕ ИМЯ ОБЪЕКТА (parent_object_id) = @TableName И i.type = 1 И is_primary_key = 1
            '
            печать @sql
            ВСТАВИТЬ В @PKObjectID (ObjectID)
            exec sp_executesql @sql,
                               N '@ TableName varchar (50), @ schema varchar (50)',
                               @ TableName = @ TableName, @ schema = @ schema
            / *
            ВЫБЕРИТЕ РАЗЛИЧНЫЙ PKObject = cco.object_id
            ОТ sys.key_constraints cco
            ПРИСОЕДИНЯЙТЕСЬ к sys.index_columns cc ON cco.parent_object_id = cc.object_id И cco.unique_index_id = cc.index_id
            ПРИСОЕДИНЯЙТЕСЬ к sys.indexes i ON cc.object_id = i.object_id И cc.index_id = i.index_id
            ГДЕ ИМЯ ОБЪЕКТА (parent_object_id) = @TableName И i. type = 1 И is_primary_key = 1
            * /

            установить @ sql =
            '
            используйте '+ @ DBName +'
            ВЫБЕРИТЕ РАЗЛИЧНЫЙ PKObject = cco.object_id
            ОТ sys.key_constraints cco
            ПРИСОЕДИНЯЙТЕСЬ к sys.index_columns cc ON cco.parent_object_id = cc.object_id И cco.unique_index_id = cc.index_id
            ПРИСОЕДИНЯЙТЕСЬ к sys.indexes i ON cc.object_id = i.object_id И cc.index_id = i.index_id
            присоединиться к sys.schemas на cco.schema_id = s.schema_id и s.name=@schema
            ГДЕ ИМЯ ОБЪЕКТА (parent_object_id) = @TableName И i.type = 2 И is_primary_key = 0 И is_unique_constraint = 1
            '
            печать @sql
            ВСТАВИТЬ @Uniques (ObjectID)
            exec sp_executesql @sql,
                               N '@ TableName varchar (50), @ schema varchar (50)',
                               @ TableName = @ TableName, @ schema = @ schema
            / *
            ВЫБРАТЬ ОТЛИЧИТЕЛЬНЫЙ PKObject = cco. object_id
            ОТ sys.key_constraints cco
            ПРИСОЕДИНЯЙТЕСЬ к sys.index_columns cc ON cco.parent_object_id = cc.object_id И cco.unique_index_id = cc.index_id
            ПРИСОЕДИНЯЙТЕСЬ к sys.indexes i ON cc.object_id = i.object_id И cc.index_id = i.index_id
            ГДЕ ИМЯ ОБЪЕКТА (parent_object_id) = @TableName И i.type = 2 И is_primary_key = 0 И is_unique_constraint = 1
            * /

            SET @ClusteredPK = CASE WHEN @@ ROWCOUNT> 0 THEN 1 ELSE 0 END

            объявить @t TestTableType
            вставить @t выбрать * из @PKObjectID
            объявить @u TestTableType
            вставить @u выбрать * из @Uniques

            установить @ sql =
            '
            используйте '+ @ DBName +'
            ВЫБЕРИТЕ отличные '', ОГРАНИЧЕНИЯ '' + replace (cco.name, @ TableName, @ NewTableName) + CASE type WHEN '' PK '' THEN '' PRIMARY KEY '' + CASE WHEN pk.ObjectID IS NULL THEN '' NONCLUSTERED '' ELSE '' CLUSTERED '' END WHEN '' UQ ' 'THEN' 'UNIQUE' 'END + CASE, КОГДА u. ObjectID НЕ НУЛЕНО ТОГДА' 'НЕКЛАСТЕРИРОВАН' 'ИНАЧЕ' '' 'END
            + '' ('' + REVERSE (SUBSTRING (REVERSE ((SELECT c.name + + CASE WHEN cc.is_descending_key = 1 THEN '' DESC '' ELSE '' ASC '' END + '', ''
            ОТ sys.key_constraints ccok
            LEFT JOIN sys.index_columns cc ON ccok.parent_object_id = cc.object_id И cco.unique_index_id = cc.index_id
            LEFT JOIN sys.columns c ON cc.object_id = c.object_id И cc.column_id = c.column_id
            LEFT JOIN sys.indexes i ON cc.object_id = i.object_id И cc.index_id = i.index_id
            ГДЕ i.object_id = ccok.parent_object_id И ccok.object_id = cco.object_id
            упорядочить по ключевому_ординалу FOR XML PATH ('' ''))), 2, 8000)) + '') ''
            ОТ sys.key_constraints cco
            внутреннее соединение sys.схемы на cco.schema_id = s.schema_id и s.name=@schema
            ЛЕВЫЙ ПРИСОЕДИНЯЙТЕСЬ @U u ON cco.object_id = u.objectID
            LEFT JOIN @t pk ON cco.object_id = pk.ObjectID
            ГДЕ ИМЯ ОБЪЕКТА (cco. parent_object_id) = @TableName

            '

            печать @sql
            ВСТАВИТЬ В @ Определение (FieldValue)
            exec sp_executesql @sql,
                               N '@ TableName varchar (50), @ NewTableName varchar (50), @ schema varchar (50), @ t TestTableType только для чтения, @ u TestTableType только для чтения',
                               @ TableName = @ TableName, @ NewTableName = @ NewTableName, @ schema = @ schema, @ t = @ t, @ u = @ u

            / *
            SELECT ', CONSTRAINT' + name + CASE type WHEN 'PK' THEN 'PRIMARY KEY' + CASE WHEN pk.ObjectID IS NULL THEN 'NONCLUSTERED' ELSE 'CLUSTERED' END WHEN 'UQ' THEN 'UNIQUE' END + CASE КОГДА u.ObjectID НЕ НУЛЕВОЙ THEN 'NONCLUSTERED' ELSE 'END
            + '(' + REVERSE (SUBSTRING (REVERSE ((SELECT c.name + + CASE WHEN cc.is_descending_key = 1 THEN 'DESC' ELSE 'ASC' END + ','
            ОТ sys.key_constraints ccok
            ЛЕВОЕ СОЕДИНЕНИЕ sys.index_columns cc ON ccok.parent_object_id = cc.object_id И cco. unique_index_id = cc.index_id
           LEFT JOIN sys.columns c ON cc.object_id = c.object_id И cc.column_id = c.column_id
           LEFT JOIN sys.indexes i ON cc.object_id = i.object_id И cc.index_id = i.index_id
           ГДЕ i.object_id = ccok.parent_object_id И ccok.object_id = cco.object_id ДЛЯ ПУТИ XML (''))), 2, 8000)) + ')'
           ОТ sys.key_constraints cco
           LEFT JOIN @PKObjectID pk ON cco.object_id = pk.ObjectID
           LEFT JOIN @Uniques u ON cco.object_id = u.objectID
           ГДЕ ИМЯ ОБЪЕКТА (cco.parent_object_id) = @TableName
           * /
        КОНЕЦ

        INSERT INTO @Definition (FieldValue) VALUES (')')

        установить @ sql =
        '
        используйте '+ @ DBName +'
        выберите '' on '' + d.имя + '' (['' + c.name + '']) ''
        из sys.tables t присоединиться к sys.indexes i on (i.object_id = t.object_id и i.index_id <2)
                          присоединиться к sys.index_columns ic on (ic.partition_ordinal> 0 и ic.index_id = i. index_id и ic.object_id = t.object_id)
                          присоединиться к sys.columns c on (c.object_id = ic.object_id и c.column_id = ic.column_id)
                          присоединиться к sys.schemas s на t.schema_id = s.schema_id
                          присоединиться к sys.data_spaces d на i.data_space_id = d.data_space_id
        где t.name=@TableName и s.name=@schema
        заказ по key_ordinal
        '

        напечатать 'x'
        печать @sql
        ВСТАВИТЬ В @ Определение (FieldValue)
        exec sp_executesql @sql,
                           N '@ TableName varchar (50), @ schema varchar (50)',
                           @ TableName = @ TableName, @ schema = @ schema

        ЕСЛИ @IncludeIndexes = 1
        НАЧИНАТЬ
            установить @ sql =
            '
            используйте '+ @ DBName +'
            ВЫБЕРИТЕ отдельный '' СОЗДАТЬ '' + i.type_desc + '' INDEX ['' + replace (i.name COLLATE SQL_Latin1_General_CP1_CI_AS, @ TableName, @ NewTableName) + ''] ON '+ @ DBName +'.  '+ @ NewTableSchema+'.'+@NewTableName+' (''
            + REVERSE (SUBSTRING (REVERSE ((SELECT name + CASE WHEN sc.is_descending_key = 1 THEN '' DESC '' ELSE '' ASC '' END + '', ''
            ИЗ sys.index_columns sc
            ПРИСОЕДИНЯЙТЕСЬ к sys.columns c ON sc.object_id = c.object_id И sc.column_id = c.column_id
            ГДЕ t.name=@TableName И sc.object_id = i.object_id И sc.index_id = i.index_id
                                         и is_included_column = 0
            ORDER BY key_ordinal ASC FOR XML PATH ('' ''))), 2, 8000)) + '') '' +
            ISNULL ('' включить ('' + REVERSE (SUBSTRING (REVERSE ((SELECT name + '', ''
            ИЗ sys.index_columns sc
            ПРИСОЕДИНЯЙТЕСЬ к sys.columns c ON sc.object_id = c.object_id И sc.column_id = c.column_id
            ГДЕ t.name=@TableName И sc.object_id = i.object_id И sc.index_id = i.index_id
                                         и is_included_column = 1
            ORDER BY key_ordinal ASC FOR XML PATH ('' ''))), 2, 8000)) + '') '', '' '') + '' ''
            ИЗ sys. indexes я присоединяюсь к sys.tables t на i.object_id = t.object_id
                               присоединиться к sys.schemas s на t.schema_id = s.schema_id
            И СЛУЧАЙ, КОГДА @ClusteredPK = 1 И is_primary_key = 1 И i.type = 1 ТОГДА 0 ЕЩЕ 1 КОНЕЦ = 1 И is_unique_constraint = 0 И is_primary_key = 0
                где т.name = @ TableName и s.name=@schema
            '

            печать @sql
            ВСТАВИТЬ В @ Определение (FieldValue)
            exec sp_executesql @sql,
                               N '@ TableName varchar (50), @ NewTableName varchar (50), @ schema varchar (50), @ClusteredPK bit',
                               @ TableName = @ TableName, @ NewTableName = @ NewTableName, @ schema = @ schema, @ ClusteredPK = @ ClusteredPK

        КОНЕЦ

            / *

                SELECT 'CREATE' + type_desc + 'INDEX [' + [name] COLLATE SQL_Latin1_General_CP1_CI_AS + '] ON [' + OBJECT_NAME (object_id) + '] (' + REVERSE (SUBSTRING (REVERSE ((SELECT name + CASE WHEN sc. is_descending_key = 1 ЗАТЕМ 'DESC' ELSE 'ASC' END + ','
                ИЗ sys.index_columns sc
                ПРИСОЕДИНЯЙТЕСЬ к sys.columns c ON sc.object_id = c.object_id И sc.column_id = c.column_id
                ГДЕ ИМЯ ОБЪЕКТА (sc.object_id) = @TableName И sc.object_id = i.object_id И sc.index_id = i.index_id
                ЗАКАЗАТЬ ПО index_column_id ASC FOR XML PATH (''))), 2, 8000)) + ')'
                ИЗ sys.indexes i
                ГДЕ OBJECT_NAME (object_id) = @TableName
                И СЛУЧАЙ, КОГДА @ClusteredPK = 1 И is_primary_key = 1 И тип = 1 ТОГДА 0 ELSE 1 END = 1 И is_unique_constraint = 0 И is_primary_key = 0

            * /

            ВСТАВИТЬ @MainDefinition (FieldValue)
            ВЫБРАТЬ FieldValue ИЗ @Definition
            ЗАКАЗАТЬ ПО идентификатору определения ASC

            ----------------------------------

            объявить @q varchar (max)

            set @ q = (выберите replace ((SELECT FieldValue FROM @MainDefinition FOR XML PATH ('')), '', ''))

            set @ script = (выберите REPLACE (@q, '', ''))
            - drop type TestTableType
КОНЕЦ попытка
- ############################################# ############################################### ################################################ ##########################
НАЧАТЬ ЛОВ
    НАЧИНАТЬ
        - INIZIO Procedura с ошибкой ============================================ ================================================== ================================================== =========
            РАСПЕЧАТАТЬ '************************************************ ************************************************* ************************************************* ******* '
            ПЕЧАТЬ 'ErrorNumber:' + CAST (ERROR_NUMBER () AS NVARCHAR (MAX))
            PRINT 'ErrorSeverity:' + CAST (ERROR_SEVERITY () AS NVARCHAR (MAX))
            ПЕЧАТЬ 'ErrorState:' + CAST (ERROR_STATE () AS NVARCHAR (MAX))
            ПЕЧАТЬ 'ErrorLine:' + CAST (ERROR_LINE () AS NVARCHAR (MAX))
            PRINT 'ErrorMessage:' + CAST (ERROR_MESSAGE () AS NVARCHAR (MAX))
            РАСПЕЧАТАТЬ '************************************************ ************************************************* ************************************************* ******* '
        - FINE Procedura с ошибкой ============================================ ================================================== ================================================== =========
    КОНЕЦ
        установить @ script = ''
    возврат -1
КОНЕЦ ЗАХВАТ
- ############################################# ############################################### ################################################ ##########################
  

для выполнения:

  объявить @s varchar (макс.