Sql запрос на создание таблицы: MS SQL Server и T-SQL

Создание запросов на создание таблицы — Visual Database Tools





Twitter




LinkedIn




Facebook




Адрес электронной почты










  • Статья

  • Чтение занимает 2 мин

Применимо к:SQL Server

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

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

  • Имя новой таблицы базы данных (целевой таблицы).

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

  • Столбцы в исходной таблице, содержимое которых нужно скопировать.

  • Порядок сортировки, когда нужно скопировать строки в определенном порядке.

  • Условия поиска для выборки строк, которые нужно скопировать.

  • Параметры группировки для случаев, когда нужно скопировать только сводные данные.

Например, следующий запрос создает новую таблицу с именем uk_customers и копирует в нее данные из таблицы customers:

SELECT *   
INTO uk_customers  
FROM customers  
WHERE country = 'UK'  

Для успешного выполнения запроса на создание таблицы:

Создание запроса на создание таблицы

  1. Добавьте на панели «Диаграмма» исходную таблицу или таблицы.

  2. В меню Конструктор запросов наведите указатель на пункт Тип изменения, а затем выберите пункт Создать таблицу.

  3. В диалоговом окне Создать таблицу введите имя целевой таблицы. Конструктор запросов и представлений не проверяет, есть ли уже такое имя и имеется ли разрешение на создание таблицы.

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

  4. Укажите столбцы, из которых будут копироваться данные, добавив их к запросу. Дополнительные сведения см. в статье Добавление столбцов в запросы (визуальные инструменты для баз данных). Копируются только те столбцы, которые добавлены в запрос. Чтобы скопировать строки целиком, выберите * (все столбцы).

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

  5. Чтобы скопировать строки в определенном порядке, укажите порядок сортировки. Дополнительные сведения см. в разделе Сортировка и группирование результатов запроса.

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

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

    Примечание

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

  7. Чтобы скопировать сводные данные, укажите параметры Group By. Дополнительные сведения см. в разделе Резюмирование результатов запросов.

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

Разделы по конструированию запросов и представлений (визуальные инструменты для баз данных)
[Типы запросов(../../ssms/visual-db-tools/types-of-queries-visual-database-tools.md)






Создать таблицу запроса (Управление данными)—ArcGIS Pro

ПодписьОписаниеТип данных

Входные таблицы

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

Входная таблица может быть из базы геоданных или из подключения к базе данных.

Table View; Raster Layer

Имя таблицы

Имя слоя или представления таблицы, которое будет создано.

Table View; Raster Layer

Опции ключевых полей

Указывает, как будет создаваться поле ObjectID для запроса. Для слоев и представлений таблиц в ArcGIS необходимо поле ObjectID. Поле ObjectID — целочисленное поле, значения которого используются для уникальной идентификации строк данных. По умолчанию – Использовать ключевые поля (USE_KEY_FIELDS в Python).

String

Ключевые поля

(Дополнительный)

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

Field

Поля

(Дополнительный)

Поля, которые будут включены в результирующий слой или представление таблицы. Если для поля установлен псевдоним, то именно он будет отображаться. Если не заданы поля, будут включены все поля из входной таблицы. Если в перечень полей добавляется поле Shape, результатом будет слой; в противном случае результатом будет представление таблицы.

Value Table

Выражение

(Дополнительный)

SQL-выражение, использованное для выбора поднабора записей.

SQL Expression
arcpy.management. MakeQueryTable(in_table, out_table, in_key_field_option, {in_key_field}, {in_field}, {where_clause})
ИмяОписаниеТип данных

in_table

[in_table,…]

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

Входная таблица может быть из базы геоданных или из подключения к базе данных.

Table View; Raster Layer

out_table

Имя слоя или представления таблицы, которое будет создано.

Table View; Raster Layer

in_key_field_option

Указывает, как будет создаваться поле ObjectID для запроса. Для слоев и представлений таблиц в ArcGIS необходимо поле ObjectID. Поле ObjectID — целочисленное поле, значения которого используются для уникальной идентификации строк данных. По умолчанию – Использовать ключевые поля (USE_KEY_FIELDS в Python).

String

in_key_field

[in_key_field,…]

(Дополнительный)

Поле или комбинация полей, которые могут быть использованы для идентификации строки в запросе. Этот параметр используется только при опции in_key_field_option = «USE_KEY_FIELDS».

Field

in_field

[[field, {alias}],…]

(Дополнительный)

Поля, которые будут включены в результирующий слой или представление таблицы. Если для поля установлен псевдоним, то именно он будет отображаться. Если не заданы поля, будут включены все поля из входной таблицы. Если в перечень полей добавляется поле Shape, результатом будет слой; в противном случае результатом будет представление таблицы.

Value Table

where_clause

(Дополнительный)

SQL-выражение, использованное для выбора поднабора записей.

SQL Expression

Пример кода

MakeQueryTable, пример 1 (окно Python)

В следующем скрипте окна Python показано, как используется функция MakeQueryTable в режиме прямого запуска.

import arcpy
arcpy.env.workspace = "C:/data/data.gdb"
arcpy.MakeQueryTable_management(["Counties","codemog"], "queryout", "ADD_VIRTUAL_KEY_FIELD", "",
                                [["Counties.OBJECTID", 'ObjectID'], ["Counties. NAME", 'Name'],
                                 ["codemog.Males", 'Males'], ["codemog.Females", 'Females']],
                                "Counties.FIPS = codemog.Fips and Counties.STATE_NAME = 'California'")

MakeQueryTable, пример 2 (автономный скрипт)

Следующий скрипт является примером использования инструмента MakeQueryTable в автономном режиме Python.

# MakeQueryTableOLEDB.py
# Description: Create a query table from two OLE DB tables using a limited set of
#               fields and establishing an equal join.
 
# Import system modules
import arcpy
 
# Local variables...
tableList = ["c:/Connections/balrog.odc/vtest.COUNTIES",\
             "c:/Connections/balrog.odc/vtest.CODEMOG"]
fieldList = [["vtest.COUNTIES.OBJECTID", 'ObjectID'], ["vtest.COUNTIES.NAME", 'Name']\
             ["vtest.CODEMOG.Males", 'Males'], ["vtest.CODEMOG.Females", 'Females']]
whereClause = "vtest.COUNTIES.FIPS = vtest.CODEMOG.Fips" +\
              "and vtest.COUNTIES.STATE_NAME = 'California'"
keyField = "vtest. COUNTIES.OBJECTID"
lyrName = "CountyCombined"
# Make Query Table...
arcpy.MakeQueryTable_management(tableList, lyrName,"USE_KEY_FIELDS", keyField, fieldList, whereClause)
# Print the total rows
print(arcpy.GetCount_management(lyrName))
 
# Print the fields
fields = arcpy.ListFields(lyrName)
for field in fields:
    print(field.name)
# Save as a dBASE file
arcpy.CopyRows_management(lyrName, "C:/temp/calinfo.dbf")

Сценарии

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

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

 USE [db]
ИДТИ
/****** Объект: StoredProcedure [dbo].[procUtils_InsertGeneratorWithId] Дата сценария: 13.06.2009 22:18:11 ******/
УСТАНОВИТЕ ANSI_NULLS ВКЛ.
ИДТИ
УСТАНОВИТЕ QUOTED_IDENTIFIER НА
ИДТИ
создать PROC [dbo].[procUtils_InsertGeneratorWithId]
(
@domain_user varchar(50),
@tableName varchar(100)
)
как
--Объявите курсор для получения информации о столбцах для указанной таблицы.
DECLARE cursCol CURSOR FAST_FORWARD ДЛЯ
ВЫБЕРИТЕ имя_столбца,тип_данных ИЗ information_schema. columns, ГДЕ имя_таблицы = @имя_таблицы
ОТКРЫТЬ курсCol
DECLARE @string nvarchar(3000) -- для хранения первой половины оператора INSERT
DECLARE @stringData nvarchar(3000) --для хранения оператора, связанного с данными (VALUES).
DECLARE @dataType nvarchar(1000) -- типы данных, возвращаемые для соответствующих столбцов
DECLARE @IDENTITY_STRING nvarchar ( 100 )
УСТАНОВИТЬ @IDENTITY_STRING = ' '
выберите @IDENTITY_STRING
НАБОР @string='INSERT '+@tableName+'('
УСТАНОВИТЬ @stringData=''
ОБЪЯВИТЬ @colName nvarchar(50)
FETCH NEXT FROM cursCol INTO @colName,@dataType
ЕСЛИ @@fetch_status<>0
 начинать
 print 'Таблица '+@tableName+' не найдена, обработка пропущена.'
 закрыть курсол
 освободить курскол
 возвращаться
КОНЕЦ
ПОКА @@FETCH_STATUS=0
НАЧИНАТЬ
ЕСЛИ @dataType в ('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+' as 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'')+''''' '),''+'
 --SELECT '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'')+'',''+'
КОНЕЦ
НАБОР @string=@string+@colName+','
FETCH NEXT FROM cursCol INTO @colName,@dataType
КОНЕЦ
ОБЪЯВИТЬ @Query nvarchar (4000)
SET @query ='SELECT '''+substring(@string,0,len(@string)) + ') VALUES(''+ ' + substring(@stringData,0,len(@stringData)-2)+' ''+'')'' FROM '+@tableName
exec sp_executesql @запрос
--выберите @запрос
ЗАКРЫТЬ cursCol
DEALLOCATE cursCol
  /*
ИСПОЛЬЗОВАНИЕ
*/
ИДТИ
 

— и второй без ID INSERTION

 USE [db]
ИДТИ
/****** Объект: StoredProcedure [dbo]. [procUtils_InsertGenerator] Дата сценария: 13.06.2009 22:20:52 ******/
УСТАНОВИТЕ ANSI_NULLS ВКЛ.
ИДТИ
УСТАНОВИТЕ QUOTED_IDENTIFIER НА
ИДТИ
СОЗДАТЬ PROC [dbo].[procUtils_InsertGenerator]
(
@domain_user varchar(50),
@tableName varchar(100)
)
как
--Объявите курсор для получения информации о столбцах для указанной таблицы.
DECLARE cursCol CURSOR FAST_FORWARD ДЛЯ
-- ВЫБЕРИТЕ имя_столбца,тип_данных ИЗ information_schema.columns, ГДЕ имя_таблицы = @имя_таблицы
/* НОВЫЙ
ВЫБЕРИТЕ c.name , sc.data_type ИЗ sys.extended_properties AS ep
ВНУТРЕННЕЕ СОЕДИНЕНИЕ sys.tables AS t ON ep.major_id = t.object_id
ВНУТРЕННЕЕ СОЕДИНЕНИЕ sys.columns AS c ON ep.major_id = c.object_id И ep.minor_id
= c.column_id
INNER JOIN INFORMATION_SCHEMA.COLUMNS sc ON t.name = sc.table_name и
c.name = sc.column_name
ГДЕ t.name = @tableName и c.is_identity=0
  */
выберите object_name(c.object_id) "TABLE_NAME", c.name "COLUMN_NAME", s.name "DATA_TYPE"
  из sys.columns c
  присоединиться к sys.systypes (s.xtype = c.system_type_id)
  где object_name(c. object_id) in (выберите имя из sys.tables, где имя не похоже на «sysdiagrams»)
   И object_name(c.object_id) в (выберите имя из sys.tables, где [name]=@tableName ) и c.is_identity=0 и s.name не похоже на 'sysname'
ОТКРЫТЬ курсCol
DECLARE @string nvarchar(3000) -- для хранения первой половины оператора INSERT
DECLARE @stringData nvarchar(3000) --для хранения оператора, связанного с данными (VALUES).
DECLARE @dataType nvarchar(1000) -- типы данных, возвращаемые для соответствующих столбцов
DECLARE @IDENTITY_STRING nvarchar ( 100 )
УСТАНОВИТЬ @IDENTITY_STRING = ' '
выберите @IDENTITY_STRING
НАБОР @string='INSERT '+@tableName+'('
УСТАНОВИТЬ @stringData=''
ОБЪЯВИТЬ @colName nvarchar(50)
FETCH NEXT FROM cursCol INTO @tableName , @colName,@dataType
ЕСЛИ @@fetch_status<>0
 начинать
 print 'Таблица '+@tableName+' не найдена, обработка пропущена.'
 закрыть курсол
 освободить курскол
 возвращаться
КОНЕЦ
ПОКА @@FETCH_STATUS=0
НАЧИНАТЬ
ЕСЛИ @dataType в ('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+' as 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'')+''''' '),''+'
 --SELECT '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'')+'',''+'
КОНЕЦ
НАБОР @string=@string+@colName+','
FETCH NEXT FROM cursCol INTO @tableName , @colName,@dataType
КОНЕЦ
ОБЪЯВИТЬ @Query nvarchar (4000)
SET @query ='SELECT '''+substring(@string,0,len(@string)) + ') VALUES(''+ ' + substring(@stringData,0,len(@stringData)-2)+' ''+'')'' FROM '+@tableName
exec sp_executesql @запрос
--выберите @запрос
ЗАКРЫТЬ cursCol
DEALLOCATE cursCol
  /*
использовать пок
идти
DECLARE @RC int
ОБЪЯВИТЬ @domain_user varchar(50)
ОБЪЯВИТЬ @tableName varchar(100)
-- TODO: Установите здесь значения параметров. 
установить @domain_user='yorgeorg'
установить @tableName = 'tbGui_WizardTabButtonAreas'
ВЫПОЛНИТЬ @RC = [POC].[dbo].[procUtils_InsertGenerator]
   @domain_user
  , @имя_таблицы
*/
ИДТИ
 

SQL CREATE TABLE

Резюме: в этом руководстве вы узнаете, как использовать оператор SQL CREATE TABLE для создания новых таблиц в базе данных.

Знакомство с оператором SQL CREATE TABLE

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

Для создания новой таблицы используется оператор SQL CREATE TABLE. Ниже показан общий синтаксис SQL-оператора CREATE TABLE:

 

СОЗДАТЬ ТАБЛИЦУ table_name( имя_столбца1 тип_данных (длина_данных), имя_столбца2 тип_данных (длина_данных), .. ОГРАНИЧЕНИЯ имя_ограничения ПЕРВИЧНЫЙ КЛЮЧ|УНИКАЛЬНЫЙ|. .. )

Рассмотрим оператор более подробно:

  • Имя таблицы : рекомендуется, чтобы имя таблицы было как можно более осмысленным. Для названия таблицы следует использовать форму множественного числа существительного, например, продукты, заказы, поставщики .. .и т.д.
  • Имя столбца : как и имя таблицы, вы должны использовать значение имени столбца. Если имя столбца длиннее, вы можете использовать аббревиатуру, например ID для идентификатора, No для номера.
  • Тип данных столбца : вы должны выбрать соответствующий тип данных для каждого столбца в таблице. Наиболее распространенными типами данных являются текстовые (VARCHAR, NVARCHAR), числовые (SMALLINT, INT, BIGINT), DATE, TIME, DATETIME, BLOB. Пожалуйста, обратитесь к конкретному руководству пользователя системы баз данных, с которой вы работаете, чтобы найти поддерживаемые типы данных.
  • Размер столбца : вы должны указать максимальную длину данных для каждого столбца. Например, если вы храните название продукта, попробуйте представить максимальную длину, которую может содержать продукт.
  • Ограничение :  Вы можете определить ограничение PRIMARY KEY, FOREIGN KEY, UNIQUE, NOT NULL или CHECK с помощью ключевого слова CONSTRAINT. Ключевое слово CONSTRAINT является необязательным.

SQL CREATE TABLE Пример

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

 

СОЗДАТЬ ТАБЛИЦУ Проекты ( ID проекта int(11) NOT NULL AUTO_INCREMENT, Имя varchar(255) НЕ NULL, Описание varchar(4000) ПО УМОЛЧАНИЮ NULL, Дата BeginDate НЕ NULL, Дата EndDate ПО УМОЛЧАНИЮ NULL, ПЕРВИЧНЫЙ КЛЮЧ (ID_проекта) )

Язык кода: PHP (php)

В таблице проектов :

  • PorjectID: первичный ключ, определяемый ограничением PRIMARY KEY.