Переменные сессии как идентификаторы - PullRequest
2 голосов
/ 03 апреля 2020

У меня возникли проблемы с использованием переменных сеанса в качестве идентификаторов в Snowflake. Я просмотрел документы:

https://docs.snowflake.com/en/sql-reference/session-variables.html

https://docs.snowflake.com/en/sql-reference/identifier-literal.html

https://docs.snowflake.com/en/sql-reference/data-types-text.html

https://docs.snowflake.com/en/sql-reference/identifiers-syntax.html

Я могу заставить их примеры работать, но то, что мне кажется логическим применением представленных концепций, не работает. Вот пример, который работает (сначала установите вашу базу данных и схему в песочницу):

input:

set (table_n, column_n) = ('test', 'c1');
select $table_n, $column_n;

output:

$TABLE_N    $COLUMN_N
test        c1

input:

create or replace table identifier($table_n) (c1 number);
insert into identifier($table_n) (c1) values (1), (2), (3);
select identifier($column_n) from identifier($table_n);

вывод:

c1
1
2
3

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

input:

insert into identifier($table_n) (identifier($column_n)) values (5), (6), (7);

output:

SQL compilation error: syntax error line 1 at position 44 unexpected '('. syntax error line 1 at position 45 unexpected '$column_n'. syntax error line 1 at position 55 unexpected ')'.

input :

create or replace table identifier($table_n) (identifier($column_n) number);

вывод:

SQL compilation error: syntax error line 1 at position 56 unexpected '('. syntax error line 1 at position 74 unexpected ')'.

Я также получаю ошибки, когда в начале или конце идентификатора есть одинарная кавычка. Если мы вернемся к первому работающему примеру и просто изменим имя столбца на «c1», произойдет сбой.

input:

set (table_n, column_n) = ('test', '\'c1\'');
select $table_n, $column_n;

output:

$TABLE_N    $COLUMN_N
test        'c1'

ввод:

create or replace table identifier($table_n) ("'c1'" number);
insert into identifier($table_n) ("'c1'") values (1), (2), (3);

вывод:

number of rows inserted
3

ввод:

select identifier($column_n) from identifier($table_n);

вывод:

SQL compilation error: error line 1 at position 18 invalid identifier '$column_n'

Любая помощь очень ценится. Мне бы очень хотелось понять, что происходит за кулисами, поэтому я действительно понимаю, как использовать Snowflake. Спасибо!

1 Ответ

0 голосов
/ 09 апреля 2020

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

INSERT INTO identifier($table_n)  VALUES (5), (6), (7);

Кажется, что потому что C1 по умолчанию используется для числовой индексации: где выходные данные выбора тогда: enter image description here

Однако для идентификатора создания (замены) (переменной) идентификатора (переменной) ...; кажется, вызывает проблемы. Две переменные, разделенные запятыми в операторах Select, не выдают ошибок.

Я нашел это примечание для SQL Идентификаторы:

"Идентификаторы (имена баз данных, имена таблиц, имена столбцов и т. Д. c.) Не могут начинаться со специальных символов, если только полное имя заключено в двойные кавычки. Для получения дополнительной информации см. Идентификаторы объектов. " из https://docs.snowflake.com/en/sql-reference/session-variables.html#using -variables-in- sql

Предварительный вывод: (переменная переменная) может быть выполнена только в переменных сеанса, а не SQL переменных (например, в JDB C API https://docs.snowflake.com/en/sql-reference/session-variables.html#setting -variables-on-connection )

Мысли?

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

select $column_n from identifier($table_n);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...