Какая функция будет эквивалентна quotename()
?
Ниже приведена часть хранимой процедуры:
declare @numcols nvarchar(max)
select @numcols = string_agg(quotename(NAME), ', ') within group (order by NAME)
from
(select distinct NAME from #parsednum) as names
Мне нужно преобразовать этот код в эквивалент снежинки, где #parsednum — это временная таблица. заранее спасибо
Когда я проверил результаты этих временных таблиц, я считаю, что мне нужно, чтобы все значения из столбца имени были заключены в разделитель и использовали listagg вместо предоставленного string_agg. Вот что я понимаю здесь.
Кажется, что имя кавычки просто учитывает символ-разделитель, являющийся частью строки, путем заключения значений в квадратные скобки перед построением списка. Для этого не существует эквивалентной функции SF, но вы можете использовать array_agg
, который автоматически позаботится об этом.
Функция Array_agg работала так, как ожидалось, и даже list_agg вернул тот же ожидаемый результат.
Поскольку QUOTENAME()
настолько специфичен для SQL Server, что преобразует строки в имена объектов сервера sql, в Snowflake не будет замены 1:1. Если квадратные скобки важны для инкапсуляции, вы можете использовать функции array_agg()
и array_to_string()
, чтобы приблизиться к тому, что делает ваш string_agg(quotename())
:
'[' || ARRAY_TO_STRING(ARRAY_AGG(NAME), '], [') || ']'
Приятно то, что если вы не хотите использовать квадратные скобки в качестве символа инкапсуляции, вы можете легко изменить их на что угодно, например на двойные кавычки:
'"' || ARRAY_TO_STRING(ARRAY_AGG(NAME), '", "') || '"'
Предостережение здесь в том, что QUOTENAME()
делает больше, чем просто инкапсулирует. Он также экранирует управляющие символы внутри строки. Если это важно, вы можете использовать регулярное выражение в столбце NAME
, прежде чем запускать функции ARRAY_TO_STRING(ARRAY_AGG())
.
Спасибо, это тоже сработало. list_agg вернул тот же ожидаемый результат.
Теперь у меня возникает проблема, когда я пытаюсь использовать сводную таблицу с полученным выше результатом. Он выдает неверный идентификатор «некоторое значение» при использовании приведенного ниже запроса внутри хранимой процедуры. Создайте или замените временную таблицу как Select * From parsednum Pivot( Max(value) for name in (||numcols||))c
Это numcols
результат этой логики? Если да, то этот sql CREATE OR REPLACE
строится в виде строки и выполняется динамически? Если да, то есть ли эта процедура в Snowflake? Если да, то инкапсулируете ли вы имена столбцов в квадратные скобки (что актуально только для сервера Microsoft sql или базы данных доступа)?
Это потрясающе, я выполнил пошаговое руководство и выполнил их как динамический SQL в Snowflake, и теперь они работают. Инкапсулировали значения numcol в одинарные кавычки и динамически выполнили описанную выше проблему.
Идеальный! Рад слышать, что у вас все работает. Это непростая вещь.
Это еще один случай, продолжающий описанный выше случай ** sql_text_transpose := ' CREATE OR REPLACE TEMP TABLE, транспонированный как выберите a.DATA_KEY как data_key, ' || всеколы || ' как все столбцы из transposenum AS a left join transposechar AS b on a.DATA_KEY = b.DATA_KEY '; ВЫПОЛНИТЬ НЕМЕДЛЕННО sql_text_transpose; ** Это приводит к отсутствию спецификации столбца.
Я не верю, что существует какой-либо встроенный эквивалент. Насколько я понимаю, эта функция существует исключительно для преобразования строки в действительный идентификатор на сервере sql. Хотите ли вы превратить строку в действительный идентификатор Snowflake или по-прежнему получать в качестве вывода действительные идентификаторы сервера sql?