В этой статье описывается инструкция T-SQL в CREATE TABLE AS SELECT (CTAS) в хранилище данных SQL Azure для разработки решений. This article explains the CREATE TABLE AS SELECT (CTAS) T-SQL statement in Azure SQL Data Warehouse for developing solutions. В статье также приводятся примеры кода. The article also provides code examples.
CREATE TABLE AS SELECT CREATE TABLE AS SELECT
Инструкция CREATE TABLE AS SELECT (CTAS) является одной из наиболее важных доступных функций T-SQL. The CREATE TABLE AS SELECT (CTAS) statement is one of the most important T-SQL features available. CTAS — это параллельная операция, которая создает новую таблицу на основе выходных данных инструкции SELECT. CTAS is a parallel operation that creates a new table based on the output of a SELECT statement. CTAS — это самый простой и быстрый способ создания и вставки данных в таблицу с помощью одной команды. CTAS is the simplest and fastest way to create and insert data into a table with a single command.
Выберите. В VS. CTAS SELECT. INTO vs. CTAS
CTAS — это более настраиваемая версия SELECT. Оператор INTO . CTAS is a more customizable version of the SELECT. INTO statement.
Ниже приведен пример простого SELECT. БИТЬ The following is an example of a simple SELECT. INTO:
Выберите. В не позволяет изменять метод распределения или тип индекса как часть операции. SELECT. INTO doesn’t allow you to change either the distribution method or the index type as part of the operation. [dbo].[FactInternetSales_new] создается с помощью типа распределения ROUND_ROBIN по умолчанию и табличной структуры КЛАСТЕРИЗОВАНного индекса COLUMNSTORE по умолчанию. You create [dbo].[FactInternetSales_new] by using the default distribution type of ROUND_ROBIN, and the default table structure of CLUSTERED COLUMNSTORE INDEX.
С другой стороны, с CTAS можно указать как распределение данных таблицы, так и тип структуры таблицы. With CTAS, on the other hand, you can specify both the distribution of the table data as well as the table structure type. Преобразование предыдущего примера в CTAS: To convert the previous example to CTAS:
Если вы пытаетесь изменить индекс в операции CTAS, а исходная таблица распределена по хэш-коду, сохраните один и тот же столбец распределения и тип данных. If you’re only trying to change the index in your CTAS operation, and the source table is hash distributed, maintain the same distribution column and data type. Это позволяет избежать перемещения данных между распределениями во время операции, что более эффективно. This avoids cross-distribution data movement during the operation, which is more efficient.
Копирование таблицы с помощью CTAS Use CTAS to copy a table
Возможно, одно из наиболее распространенных применений CTAS — создание копии таблицы для изменения DDL. Perhaps one of the most common uses of CTAS is creating a copy of a table in order to change the DDL. Предположим, что вы изначально создали таблицу как ROUND_ROBIN и теперь хотите изменить ее на таблицу, распределенную по столбцу. Let’s say you originally created your table as ROUND_ROBIN , and now want to change it to a table distributed on a column. CTAS — это то, как можно изменить столбец распределения. CTAS is how you would change the distribution column. CTAS также можно использовать для изменения секционирования, индексирования или типов столбцов. You can also use CTAS to change partitioning, indexing, or column types.
Предположим, что вы создали эту таблицу с использованием типа распределения по умолчанию ROUND_ROBIN , не указывая столбец распределения в CREATE TABLE . Let’s say you created this table by using the default distribution type of ROUND_ROBIN , not specifying a distribution column in the CREATE TABLE .
Теперь нужно создать новую копию этой таблицы с Clustered Columnstore Index , чтобы можно было воспользоваться преимуществами производительности кластеризованных таблиц columnstore. Now you want to create a new copy of this table, with a Clustered Columnstore Index , so you can take advantage of the performance of Clustered Columnstore tables. Также необходимо распространить эту таблицу на ProductKey , так как вы ожидаете объединения в этой статье и хотите избежать перемещения данных во время соединений в ProductKey . You also want to distribute this table on ProductKey , because you’re anticipating joins on this column and want to avoid data movement during joins on ProductKey . Наконец, необходимо также добавить секционирование на OrderDateKey , чтобы можно было быстро удалить старые данные, удалив старые секции. Lastly, you also want to add partitioning on OrderDateKey , so you can quickly delete old data by dropping old partitions. Ниже приведена инструкция CTAS, которая копирует старую таблицу в новую таблицу. Here is the CTAS statement, which copies your old table into a new table.
Наконец, можно переименовать таблицы, чтобы заменить их новой таблицей, а затем удалить старую таблицу. Finally, you can rename your tables, to swap in your new table and then drop your old table.
Использование CTAS для обхода неподдерживаемых функций Use CTAS to work around unsupported features
Вы также можете использовать CTAS для обхода ряда неподдерживаемых функций, перечисленных ниже. You can also use CTAS to work around a number of the unsupported features listed below. Этот метод часто может оказаться полезным, так как он не только будет соответствовать коду, но и часто будет работать быстрее в хранилище данных SQL. This method can often prove helpful, because not only will your code be compliant, but it will often run faster on SQL Data Warehouse. Эта производительность является результатом полностью параллелизации проекта. This performance is a result of its fully parallelized design. Сценарии включают: Scenarios include:
- Синтаксис соединения ANSI с операторами обновления ANSI JOINS on UPDATEs
- Синтаксис соединения ANSI с операторами удаления ANSI JOINs on DELETEs
- Оператор MERGE MERGE statement
Постарайтесь подумать «CTAS First». Try to think "CTAS first." Решение проблемы с помощью CTAS обычно является хорошим подходом, даже если в результате вы пишете больше данных. Solving a problem by using CTAS is generally a good approach, even if you’re writing more data as a result.
Замена синтаксиса соединения ANSI для операторов обновления ANSI join replacement for update statements
Может оказаться, что имеется сложное обновление. You might find that you have a complex update. Обновление соединяет более двух таблиц с помощью синтаксиса соединений ANSI для выполнения обновления или удаления. The update joins more than two tables together by using ANSI join syntax to perform the UPDATE or DELETE.
Допустим, вам нужно обновить следующую таблицу: Imagine you had to update this table:
Исходный запрос мог бы выглядеть примерно так, как показано в следующем примере: The original query might have looked something like this example:
Хранилище данных SQL не поддерживает объединения ANSI в предложении FROM инструкции UPDATE , поэтому вы не можете использовать предыдущий пример, не изменяя его. SQL Data Warehouse doesn’t support ANSI joins in the FROM clause of an UPDATE statement, so you can’t use the previous example without modifying it.
Для замены предыдущего примера можно использовать сочетание CTAS и неявного объединения. You can use a combination of a CTAS and an implicit join to replace the previous example:
Замена синтаксиса соединения ANSI для операторов удаления ANSI join replacement for delete statements
Иногда лучшим подходом к удалению данных является использование CTAS, особенно для DELETE инструкций, использующих синтаксис соединений ANSI. Sometimes the best approach for deleting data is to use CTAS, especially for DELETE statements that use ANSI join syntax. Это связано с тем, что хранилище данных SQL не поддерживает соединение ANSI в предложении FROM инструкции DELETE . This is because SQL Data Warehouse doesn’t support ANSI joins in the FROM clause of a DELETE statement. Вместо удаления данных выберите данные, которые необходимо защитить. Rather than deleting the data, select the data you want to keep.
Ниже приведен пример преобразованной инструкции DELETE . The following is an example of a converted DELETE statement:
Замена операторов объединения Replace merge statements
Инструкции MERGE, по крайней мере, в части, можно заменить с помощью CTAS. You can replace merge statements, at least in part, by using CTAS. INSERT и UPDATE можно объединить в одну инструкцию. You can combine the INSERT and the UPDATE into a single statement. Все удаленные записи должны быть ограничены инструкцией SELECT , чтобы исключить их из результатов. Any deleted records should be restricted from the SELECT statement to omit from the results.
Следующий пример предназначен для UPSERT : The following example is for an UPSERT :
явно указывайте тип данных и допустимость нулевого результата. Explicitly state data type and nullability of output
При переносе кода может оказаться, что вы запустили этот тип шаблона кодирования: When migrating code, you might find you run across this type of coding pattern:
Вы можете подумать, что следует перенести этот код в CTAS, и вы должны быть правильными. You might think you should migrate this code to CTAS, and you’d be correct. Однако здесь есть скрытая ошибка. However, there’s a hidden issue here.
Следующий код не дает такого же результата: The following code doesn’t yield the same result:
Обратите внимание, что в столбец "результат" переходит тип данных и допустимость нулевых значений выражения. Notice that the column "result" carries forward the data type and nullability values of the expression. Перенос типа данных вперед может привести к незначительным дисперсиям в значениях, если это не так осторожно. Carrying the data type forward can lead to subtle variances in values if you aren’t careful.
Попробуйте следующий пример: Try this example:
Значение, сохраненное в качестве результата, будет иным. The value stored for result is different. Так как сохраненное значение в столбце Result используется в других выражениях, эта ошибка становится еще более значительной. As the persisted value in the result column is used in other expressions, the error becomes even more significant.

Это важно для переноса данных. This is important for data migrations. Несмотря на то, что второй запрос является более точным, существует проблема. Even though the second query is arguably more accurate, there’s a problem. Данные будут отличаться по сравнению с исходной системой, что ведет к вопросам целостности при миграции. The data would be different compared to the source system, and that leads to questions of integrity in the migration. Это один из тех редких случаев, когда "неправильный" ответ на деле оказывается верным! This is one of those rare cases where the "wrong" answer is actually the right one!
Причина, по которой происходит различие между двумя результатами, обусловлена неявной приведением типов. The reason we see a disparity between the two results is due to implicit type casting. В первом примере таблица определяет определение столбца. In the first example, the table defines the column definition. При вставке строки происходит неявное преобразование типа. When the row is inserted, an implicit type conversion occurs. Во втором примере отсутствует неявное преобразование типа, так как выражение определяет тип данных столбца. In the second example, there is no implicit type conversion as the expression defines the data type of the column.
Обратите внимание, что столбец во втором примере определен как столбец, допускающий значение null, тогда как в первом примере он не имеет значения. Notice also that the column in the second example has been defined as a NULLable column, whereas in the first example it has not. Когда таблица была создана в первом примере, допустимость значений NULL в столбце была определена явно. When the table was created in the first example, column nullability was explicitly defined. Во втором примере он оставил выражение, а по умолчанию — определение NULL. In the second example, it was left to the expression, and by default would result in a NULL definition.
Чтобы устранить эти проблемы, необходимо явным образом задать преобразование типа и допустимость значений NULL в части SELECT инструкции CTAS. To resolve these issues, you must explicitly set the type conversion and nullability in the SELECT portion of the CTAS statement. Эти свойства нельзя задать в "CREATE TABLE". You can’t set these properties in ‘CREATE TABLE’. В следующем примере показано, как исправить код: The following example demonstrates how to fix the code:
Обратите внимание на следующее. Note the following:
- Можно использовать функции CAST или CONVERT. You can use CAST or CONVERT.
- Используйте ISNULL, а не объединение, чтобы принудительно реализовать допустимость значений NULL. Use ISNULL, not COALESCE, to force NULLability. См. следующее примечание. See the following note.
- Функция ISNULL является самой внешней функцией. ISNULL is the outermost function.
- Вторая часть функции ISNULL — константа 0. The second part of the ISNULL is a constant, 0.
Чтобы правильно задать допустимость значений NULL, необходимо использовать ISNULL, а не объединение. For the nullability to be correctly set, it’s vital to use ISNULL and not COALESCE. Функция объединения не является детерминированной, поэтому результат выражения всегда будет допускать значение null. COALESCE is not a deterministic function, and so the result of the expression will always be NULLable. ISNULL работает иначе. ISNULL is different. Он детерминирован. It’s deterministic. Поэтому, если вторая часть функции ISNULL является константой или литералом, результирующее значение не будет равно NULL. Therefore, when the second part of the ISNULL function is a constant or a literal, the resulting value will be NOT NULL.
Проверка целостности вычислений также важна для переключения секций таблиц. Ensuring the integrity of your calculations is also important for table partition switching. Представьте, что эта таблица определена как таблица фактов: Imagine you have this table defined as a fact table:
Однако поле Amount является вычисляемым выражением. However, the amount field is a calculated expression. Он не является частью исходных данных. It isn’t part of the source data.
Для создания секционированного набора данных может потребоваться следующий код: To create your partitioned dataset, you might want to use the following code:
Запрос будет работать отлично. The query would run perfectly well. Проблема возникает при попытке переключения секций. The problem comes when you try to do the partition switch. Определения таблиц не совпадают. The table definitions don’t match. Чтобы определения таблиц совпадали, измените CTAS, чтобы добавить функцию ISNULL , чтобы сохранить атрибут допустимости значений NULL для столбца. To make the table definitions match, modify the CTAS to add an ISNULL function to preserve the column’s nullability attribute.
Вы можете увидеть, что согласованность типов и поддерживать свойства значений NULL в CTAS — это лучшая в проектировании методика. You can see that type consistency and maintaining nullability properties on a CTAS is an engineering best practice. Это помогает поддерживать целостность вычислений, а также обеспечивает возможность переключения секций. It helps to maintain integrity in your calculations, and also ensures that partition switching is possible.
CTAS является одной из наиболее важных инструкций в хранилище данных SQL. CTAS is one of the most important statements in SQL Data Warehouse. Научитесь его применять. Make sure you thoroughly understand it. См. документацию по CTAS. See the CTAS documentation.
Дальнейшие действия Next steps
Дополнительные советы по разработке см. в статье Общие сведения о разработке. For more development tips, see the development overview.
This question already has an answer here:
I want to create a table from select query result in SQL Server, I tried
but I got an error
Incorrect syntax near the keyword ‘AS’

marked as duplicate by steoleary, giammin, CJM, LordOfThePigs, Jonathan Leech-Pepin Jan 24 ’14 at 14:19
This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.
6 Answers 6
Use following syntax to create new table from old table in SQL server 2008
use SELECT. INTO
The SELECT INTO statement creates a new table and populates it with the result set of the SELECT statement. SELECT INTO can be used to combine data from several tables or views into one table. It can also be used to create a new table that contains data selected from a linked server.

Please be careful, MSSQL: "SELECT * INTO NewTable FROM OldTable"
is not always the same as MYSQL: "create table temp AS select.."
I think that there are occasions when this (in MSSQL) does not guarantee that all the fields in the new table are of the same type as the old.
THIS TOPIC APPLIES TO:
SQL Server
Azure SQL Database
Azure SQL Data Warehouse
Parallel Data Warehouse
Создание таблицы AS SELECT (CTAS) — одна из наиболее важных функций T-SQL. Это полностью распараллеленная операция, которая создает новую таблицу на основе выходных данных инструкции SELECT. CTAS — простой и быстрый способ создания копии таблицы.
Например можно используйте CTAS для:
- Повторно создайте таблицу со столбцом распространения особый хэш-код.
- Создайте индекс columnstore на лишь некоторые из столбцов в таблице.
- Запрос или импортировать внешние данные.
| Примечание |
|---|
Поскольку CTAS добавляет возможности создания таблицы, в этом разделе пытается не повторять в разделе CREATE TABLE. Вместо этого он описываются различия между инструкциями CTAS и CREATE TABLE. CREATE TABLE Подробнее CREATE TABLE (хранилище данных SQL Azure) инструкции.
Синтаксические обозначения в Transact-SQL
Дополнительные сведения см. в разделе разделе аргументы в инструкции CREATE TABLE.
Параметры столбца
column_name [ . n ]
Имена столбцов не допускают параметры столбца упоминалось в инструкции CREATE TABLE. Вместо этого можно предоставить необязательный список из одного или нескольких имен столбцов для новой таблицы. Столбцы в новой таблице будет использовать заданные имена. При указании имен столбцов, число столбцов в списке столбцов должно совпадать количество столбцов в списке результатов выберите. Если не указать имена столбцов, новая целевая таблица будет использовать имена столбцов в результатах инструкции select.
Нельзя указать параметры столбцов типов данных, параметров сортировки или допустимости значений NULL. Каждый из этих атрибутов является производным от результатов SELECT инструкции. Тем не менее можно использовать инструкцию SELECT для изменения атрибутов. Пример см. в разделе CTAS используется для изменения столбца атрибутов .
Параметры таблицы распределения
DISTRIBUTION = HASH ( distribution_column_name ) | ROUND_ROBIN | РЕПЛИКАЦИЯ
Инструкция CTAS требует параметр распространения и не имеет значения по умолчанию. Это отличается от СОЗДАНИЯ таблицы, которая имеет значения по умолчанию.
См. Дополнительные сведения и понять, как выбрать лучший столбец распределения, параметры распространения таблицы раздел в инструкции CREATE TABLE.
Параметры секционирования таблицы
CTAS оператор создает несекционированная таблица по умолчанию, даже если исходная таблица секционирована. Создание секционированной таблицы с помощью оператора CTAS, необходимо указать параметр секционирования.
Дополнительные сведения см. в разделе параметры секционирования таблицы раздел в инструкции CREATE TABLE.
Выберите параметры
Инструкция select является фундаментальное различие между CTAS и CREATE TABLE.
WITH обобщенноетабличноевыражение
Задается временно именованный результирующий набор, называемый обобщенным табличным выражением (ОТВ). Дополнительные сведения см. в разделе WITH обобщенноетабличноевыражение (Transact-SQL).
SELECT select_criteria
Заполнение новой таблицы с результатами из инструкции SELECT. select_criteria является тело инструкции SELECT, которая определяет, какие данные необходимо скопировать в новую таблицу. Сведения об инструкциях SELECT см. в разделе SELECT (Transact-SQL).
Требуется CTAS SELECT разрешений на любые объекты, на которые ссылается select_criteria.
Разрешения на создание таблицы в разделе разрешений в инструкции CREATE TABLE.
Дополнительные сведения см. в разделе Общие замечания в инструкции CREATE TABLE.
Хранилище данных SQL Azure делает еще не поддержку автоматического создания или автоматическое обновление статистики. Чтобы добиться оптимальной производительности запросов, очень важно создать статистику для всех столбцов всех таблиц после запуска CTAS и после любого значительных изменений в данных. Дополнительные сведения см. в разделе CREATE STATISTICS (Transact-SQL).
SET ROWCOUNT (Transact-SQL) не влияет на CTAS. Чтобы обеспечить такое же поведение, используйте ВЕРХНЕЙ (Transact-SQL).
Дополнительные сведения см. в разделе ограничения в инструкции CREATE TABLE.
Дополнительные сведения см. в разделе поведение блокировки в инструкции CREATE TABLE.
Для распределенных хэш таблицы Чтобы выбрать столбец различных распространения для повышения производительности для соединения и статистические вычисления можно использовать CTAS. При выборе другого дистрибутива столбец не является поставленной задачи, вы получите лучшую производительность CTAS при указании один и тот же столбец распределения, поскольку это позволит избежать повторного распространения строк.
Если создать небольшую таблицу с помощью CTAS и производительности не имеет значения, можно указать ROUND_ROBIN во избежание необходимости выбрать столбец распределения.
A. Используйте CTAS, чтобы скопировать таблицу
Область применения: хранилище данных Azure SQL и параллельные хранилища данных
Возможно одно из наиболее распространенных использует CTAS создает копию таблицы, можно изменить DDL. Так что использовались при создании таблицы как ROUND_ROBIN и теперь хотите изменить его в таблицу, распределенных по столбцу, CTAS является изменение столбца распределения. CTAS может также использоваться для изменения типа секционирование, индексирование или столбца.
Предположим, вы создали эту таблицу с помощью стандартного типа распространения ROUND_ROBIN распределенных, поскольку не распространения указан столбец в CREATE TABLE .
Теперь необходимо создать новую копию этой таблицы кластеризованный индекс, чтобы воспользоваться преимуществами производительности кластеризованный индекс таблицы. Также требуется распространить этой таблицы по ProductKey, поскольку вы планируете выполнять соединения по этому столбцу и требуется избежать перемещения данных во время соединения на ProductKey. Наконец необходимо также добавить секционирование по OrderDateKey, чтобы быстро старые данные можно удалить, удалив старые секции. Вот CTAS инструкцию, которая бы скопировать вашей старой таблицы в новую таблицу.
Наконец, можно переименовать таблиц для замены в новой таблице, а затем удалите старый таблицы.
Б. Используйте CTAS, чтобы изменить атрибуты столбцов
Область применения: хранилище данных Azure SQL и параллельные хранилища данных
Чтобы изменить типы данных, допустимость значений NULL и параметры сортировки для нескольких столбцов в таблице DimCustomer2 в этом примере используется CTAS.
Наконец, можно использовать RENAME (Transact-SQL) переключение имена таблиц. Это делает DimCustomer2 быть новой таблицы.
В. Чтобы изменить способ распространения для таблицы использовать CTAS
Область применения: хранилище данных Azure SQL и параллельные хранилища данных
В этом простом примере показано, как изменить метод распределения для таблицы. Чтобы отобразить механизмы, как это сделать, изменяется распределенных хэш таблицу для циклического и изменения таблицы циклического хэш-распределения. Последняя таблица совпадает с исходной таблицей.
В большинстве случаев не потребуется изменить таблицу циклического распределенных хэш таблицы. Более часто необходимо изменить таблицу циклический перебор в распределенных хэш-таблицу. Например вы сначала загрузить новые таблицы в качестве циклического и затем переместить ее позже распределенных хэш таблицу, повысить производительность соединения.
В этом примере используется образец базы данных AdventureWorksDW. Чтобы загрузить версию хранилища данных SQL, см. раздел Загрузка образца данных в хранилище данных SQL
Далее измените его обратно распределенных хэш-таблицу.
Г. Используйте CTAS, чтобы создать таблицу с меньшим количеством столбцов.
Область применения: хранилище данных Azure SQL и параллельные хранилища данных
В следующем примере создается распределенной циклического таблицы с именем myTable (c, ln) . Новая таблица содержит только два столбца. Он использует псевдонимы столбцов в инструкции SELECT для имен столбцов.
Д. Использование подсказки в запросе с CREATE TABLE AS SELECT (CTAS)
Область применения: хранилище данных Azure SQL и параллельные хранилища данных
Этот запрос показан основной синтаксис для использования подсказки в запросе соединения с помощью оператора CTAS. После отправки запроса Хранилище данных SQL применяется стратегия соединения хэш при формировании плана запроса для каждого отдельного распределения. Дополнительные сведения о хэш указание запроса соединения см. предложение OPTION (Transact-SQL).
Е. Использовать CTAS для импорта данных из хранилища больших двоичных объектов
Область применения: хранилище данных Azure SQL и параллельные хранилища данных
Для импорта данных из внешней таблицы, просто используйте CREATE TABLE AS SELECT для выбора из внешней таблицы. Синтаксис для выборки данных из внешней таблицы в Хранилище данных SQL совпадает с синтаксисом для выбора данных из обычной таблицы.
В следующем примере определяется внешнюю таблицу с данными в учетной записи хранения больших двоичных объектов. Затем используется CREATE TABLE AS SELECT для выбора из внешней таблицы. Это импортирует данные из файлов с разделителями текст хранилища больших двоичных объектов и сохраняет данные в новую Хранилище данных SQL таблицы.
Ж. Использовать CTAS для импорта данных Hadoop из внешней таблицы
Применяется к:Параллельное хранилище данных
Для импорта данных из внешней таблицы, просто используйте CREATE TABLE AS SELECT для выбора из внешней таблицы. Синтаксис для выборки данных из внешней таблицы в Параллельное хранилище данных совпадает с синтаксисом для выбора данных из обычной таблицы.
В следующем примере определяется внешней таблицы в кластере Hadoop. Затем используется CREATE TABLE AS SELECT для выбора из внешней таблицы. Это импортирует данные из файлов с разделителями текст Hadoop и сохраняет данные в новую Параллельное хранилище данных таблицы.
Позволяет обойти некоторые неподдерживаемые функции CTAS. Помимо возможности для запуска кода в хранилище данных, переписывание существующего кода для использования CTAS обычно повышает производительность. Это связано с распараллеленной структурой.
| Примечание |
|---|
Попробуйте подумать «CTAS первый». Если вы считаете, может решить проблему с помощью CTAS затем это обычно лучший способ начать его — даже при создании дополнительных данных в результате.
З. Использовать CTAS вместо SELECT. В
Область применения: хранилище данных Azure SQL и параллельные хранилища данных
Код SQL Server обычно использует SELECT. INTO для заполнения таблицы результатов инструкции SELECT. Это пример SQL Server, выберите. В инструкции.
Этот синтаксис не поддерживается в хранилище данных SQL и параллельных хранилищ данных. В этом примере показано, как перезаписать предыдущие SELECT. В инструкции, как инструкция CTAS. Можно выбрать любой из параметров РАСПРОСТРАНЕНИЯ, описанных в синтаксисе CTAS. В этом примере метод распространения ROUND_ROBIN.
И. Использовать для замены соединения ANSI в CTAS и неявного соединения FROM предложения UPDATE инструкции
Область применения: хранилище данных Azure SQL и параллельные хранилища данных
Вы можете обнаружить, что у вас есть сложные обновление, которое соединяет вместе с использованием синтаксиса объединения ANSI для выполнения обновления или удаления более двух таблиц.
Допустим, вам нужно обновить следующую таблицу:
Исходный запрос может выглядеть следующим образом:
Поскольку хранилище данных SQL не поддерживает ANSI соединения FROM предложения UPDATE инструкции, нельзя использовать этот код SQL Server через без изменения его немного.
Можно использовать сочетание CTAS и неявное соединение для замены этого кода:
К. Используйте CTAS, чтобы указать, какие данные следует хранить вместо ANSI соединения в предложении FROM инструкции DELETE
Область применения: хранилище данных Azure SQL и параллельные хранилища данных
Иногда для удаления данных лучше всего использовать CTAS . Вместо удаления данных просто выделите данные, которые требуется сохранить. Это особенно верно для DELETE инструкции, которые используют соединения присоединяемый синтаксиса, так как хранилище данных SQL не поддерживает ANSI в ansi FROM предложения DELETE инструкции.
Пример преобразованного оператора DELETE приведен ниже:
Л. Используйте CTAS, чтобы упростить инструкций merge
Область применения: хранилище данных Azure SQL и параллельные хранилища данных
Операторы объединения может быть заменен, по крайней мере в части с помощью CTAS . Можно консолидировать INSERT и UPDATE в одну инструкцию. Удаленные записи необходимо ликвидировать вторая инструкция.
Пример UPSERT приведен ниже:
М. Явно указать тип данных и допустимость нулевого результата
Область применения: хранилище данных Azure SQL и параллельные хранилища данных
При переносе кода SQL Server в хранилище данных SQL, вам может встретить этот тип шаблона кодирования:
Инстинктивно вы думаете, этот код нужно перенести в ctas, и они будут правильно. Тем не менее существует подводных камнях.
Следующий код не дает тот же результат:
Обратите внимание, что столбец «результат» переносятся данных тип и допустимость нулевых значений выражения. Если не соблюдать осторожность, это может привести к определенной вариации значений.
Попробуйте сделать следующее в качестве примера:
Значение, сохраненное в качестве результата отличается. Как значение, сохраненное в столбце результатов используется в других выражениях, ошибка становится еще более значительным.
.f7566d35-a632-4c40-8c32-4b8766c2a97c(ru-ru).jpeg)
Это особенно важно при переносе данных. Несмотря на то, что второй запрос, безусловно, более точен существует проблема. Данные будут разными в исходной системе и что ставит под сомнение достоверность миграции. Это один из тех редких случаев, где «неправильный» ответ — на самом деле верным!
Поэтому мы расхождения двух результатов связана с неявное приведение. В первом примере таблица дает определение столбца. При вставке строки происходит неявное преобразование типов. Во втором примере отсутствует неявное преобразование как выражение определяет тип данных столбца. Обратите внимание, что столбец во втором примере определен как столбец допускает значения NULL, тогда как в первом примере не установлена. Если таблица была создана в первый столбец примере допустимость значений NULL явно определены. Во втором примере указано только выражение, а по умолчанию это приведет к определению NULL.
Для устранения этих проблем необходимо явно задать преобразование типа данных и допустимость значений NULL в SELECT часть CTAS инструкции. Эти свойства нельзя задать в части создания таблицы.
В приведенном ниже примере показано, как исправить код:
Следует отметить следующее.
- CAST или CONVERT мог бы использоваться
- Функция ISNULL используется, чтобы обеспечить допустимость значений NULL не COALESCE
- Функция ISNULL является внешней функцией
- Вторая часть оператора ISNULL является константой т. е. 0
| Примечание |
|---|
Для правильного задания допустимости важно использовать ISNULL и не COALESCE . COALESCE не является детерминированной функцией, и поэтому результат выражения всегда будет иметь значения NULL. ISNULL отличается. Он является детерминированным. Поэтому если во второй части ISNULL функция является константой или литералом, то результирующее значение будет NOT NULL.
Эта рекомендация не только позволяет добиться точности вычислений. Также важно для переключения секций таблицы. Представьте, что у вас есть эта таблица определена как факт:
В поле значение то, вычисляемое выражение не является частью источника данных.
Для создания набора секционированных данных может потребоваться сделать это:
Запрос выполняется нормально. Проблема возникает при попытке выполнить переключение между разделами. Определения таблиц не совпадают. Для определения таблиц совпадают CTAS должно быть изменено.
Вы увидите таким образом, согласованности типов и поддержка свойства допустимости нулевых значений в ctas всегда лучше хорошее проектирование. Он помогает поддерживать целостность вычислений и также гарантирует, что возможно переключение секций.




