Есть ли альтернатива CREATE TYPE в SQL, поскольку CREATE TYPE не поддерживается в хранилище данных SQL Azure - PullRequest
1 голос
/ 15 марта 2019

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

CREATE TYPE DataTypeforCustomerTable AS TABLE(
    PersonID int,
    Name varchar(255),
    LastModifytime datetime
);
GO

CREATE PROCEDURE usp_upsert_customer_table @customer_table DataTypeforCustomerTable READONLY
AS

BEGIN
  MERGE customer_table AS target
  USING @customer_table AS source
  ON (target.PersonID = source.PersonID)
  WHEN MATCHED THEN
      UPDATE SET Name = source.Name,LastModifytime = source.LastModifytime
  WHEN NOT MATCHED THEN
      INSERT (PersonID, Name, LastModifytime)
      VALUES (source.PersonID, source.Name, source.LastModifytime);
END
GO

CREATE TYPE DataTypeforProjectTable AS TABLE(
    Project varchar(255),
    Creationtime datetime
);
GO

CREATE PROCEDURE usp_upsert_project_table @project_table DataTypeforProjectTable READONLY
AS

BEGIN
  MERGE project_table AS target
  USING @project_table AS source
  ON (target.Project = source.Project)
  WHEN MATCHED THEN
      UPDATE SET Creationtime = source.Creationtime
  WHEN NOT MATCHED THEN
      INSERT (Project, Creationtime)
      VALUES (source.Project, source.Creationtime);
END

Есть ли альтернативный способ сделать это.

Ответы [ 2 ]

1 голос
/ 15 марта 2019

Временные таблицы в хранилище данных SQL Azure немного отличаются по поведению от продукта SQL Server или базы данных SQL Azure - они существуют на уровне сеанса.Поэтому все, что вам нужно сделать, это преобразовать ваши операторы CREATE TYPE во временные таблицы и разбить MERGE на отдельные операторы INSERT / UPDATE / DELETE, как требуется.

Пример:

CREATE TABLE #DataTypeforCustomerTable (
    PersonID        INT,
    Name            VARCHAR(255),
    LastModifytime  DATETIME
)
WITH
(
    DISTRIBUTION = HASH( PersonID ),
    HEAP
)
GO

CREATE PROCEDURE usp_upsert_customer_table 
AS

BEGIN

    -- Add records which do not already exist
    INSERT INTO customer_table ( PersonID, Name, LastModifytime )
    SELECT PersonID, Name, LastModifytime
    FROM #DataTypeforCustomerTable AS source
    WHERE NOT EXISTS
        (
        SELECT *
        FROM customer_table target
        WHERE source.PersonID = target.PersonID
        )
...

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

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

1 голос
/ 15 марта 2019

У вас есть несколько проблем, потому что большинство из того, что вы пытаетесь конвертировать, не способ сделать что-то на ASDW.

Во-первых, как вы отмечаете, CREATE TYPE не поддерживаетсяи не существует эквивалентной альтернативы.

Далее, код, кажется, выполняет одиночные вставки в таблицу.Это действительно плохо для ASDW, производительность будет ужасной.

Далее, пока нет заявления MERGE для ASDW.Это потому, что ОБНОВЛЕНИЕ не лучший способ обработки изменяющихся данных.

И, наконец, хранимые процедуры в ASDW работают немного по-другому, они не компилируются, а интерпретируются при каждом вызове процедуры.Хранимые процедуры отлично подходят для больших кусков логики уровня таблицы, но не рекомендуются для вызовов большого объема с однострочными операциями.

Мне нужно больше знать о сценарии использования, чтобы давать конкретные рекомендации, но вВообще вам нужно думать в таблицах, а не в строках.В частности, обратите внимание на способ обработки вашего ELT способом CREATE TABLE AS (* CTAS).

Вот хорошая ссылка, она показывает, как можно выполнить эквивалент слияния / переноса с помощью CTAS:

https://docs.microsoft.com/en-us/azure/sql-data-warehouse/sql-data-warehouse-develop-ctas#replace-merge-statements

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

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

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