U-SQl объявляет @variables как ноль - PullRequest
0 голосов
/ 29 мая 2019

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

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

DECLARE @missing_column string IS NULL;  // This does not work.

Как бы вы порекомендовали это сделать?Я знаю, что могу написать слова «NULL» в виде строки и вставить ее как таковую.Но это не сработает для столбца, если он десятичный.

1 Ответ

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

U-SQL использует систему типов C #, поэтому вам нужно определять типы и присваивать значения с использованием синтаксиса C #.Это означает, что вам нужно будет использовать обнуляемый тип и назначить правильно набранные null значения:

Поскольку string уже является обнуляемым типом, вы можете просто использовать:

DECLARE @missing_column string = (string)null;

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

DECLARE @missing_column int? = (int?)null;

Официальная документация по U-SQL DECLARE утверждений можно найти здесь .


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

Определение основной таблицы:

CREATE TABLE dbo.MasterTarget
(
  Col1 Int,
  Col2 string,    // string is already nullable
  Col3 DateTime?, // DateTime is not, so need to specify DateTime? that accepts null values
  INDEX clx_Col1 CLUSTERED(Col1 ASC)
)
DISTRIBUTED BY HASH(Col1);

Загрузка данных всех столбцов:

@src1 =
    EXTRACT Col1 Int,
            Col2 string,
            Col3 DateTime
    FROM "/SourceFile1.csv"
    USING Extractors.Csv();

INSERT INTO dbo.MasterTarget
(
  Col1,
  Col2,
  Col3
)
SELECT Col1,
       Col2,
       Col3
FROM @src1;

Отсутствует загрузка данных столбца:

@src2 =
    EXTRACT Col1 Int,
            Col2 string
    FROM "/SourceFile2.csv"
    USING Extractors.Csv();

INSERT INTO dbo.MasterTarget
(
  Col1,
  Col2
)
SELECT Col1,
       Col2
FROM @src2;
...