Как использовать имя представления, хранящееся в поле для запроса sql?

У меня есть таблица с полем view_name (varchar (256)), и я хотел бы использовать это поле в запросе sql.

Пример :

ТАБЛИЦА University_members

id | тип | view_name | считать

1 | профессора | view_professors | 0

2 | студенты | view_students2 | 0

3 | персонал | view_staff4 | 0

И я хотел бы обновить все строки некоторым агрегатом, рассчитанным в соответствующем представлении (например, ..SET count = SELECT count(*) FROM view_professors).

Вероятно, это вопрос новичка, я предполагаю, что это либо очевидно невозможно, либо тривиально. Приветствуются комментарии к дизайну, то есть способ обработки метаданных (явное хранение имен объектов БД в виде строк). Хотя у меня нет контроля над этим дизайном (так что мне все равно придется найти ответ), я предполагаю, что он не такой чистый, хотя некоторые внешние ограничения продиктовали его, поэтому я был бы очень признателен за мнение сообщества по этому поводу для моей личной выгоды. .

Я использую SQL Server 2005, но приветствуются кроссплатформенные ответы.

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
0
157
4

Ответы 4

Для этого вам нужно будет сделать это как немного динамического SQL, что-то вроде этого может сработать, очевидно, вам нужно будет отредактировать, чтобы фактически соответствовать тому, что вы пытаетесь сделать.

DECLARE @ViewName VARCHAR(500)

SELECT @ViewName = view_name
FROM University_Members
WHERE Id = 1

DECLARE @SQL VARCHAR(MAX)

SET @SQL = '
UPDATE YOURTABLE
SET YOURVALUE = SELECT COUNT(*) FROM ' + @ViewName + '
WHERE yourCriteria = YourValue'

EXEC(@SQL)

На мой взгляд, вы можете сгенерировать код SQL в переменной VARCHAR (MAX), а затем выполнить его с помощью ключевого слова EXEC. Я не знаю, как сделать это напрямую, как вы пытались.

Пример:

DECLARE @SQL VARCHAR(MAX)
SET @SQL = ''
SELECT @SQL = @SQL + 'UPDATE university_members SET count = (SELECT COUNT(*) FROM ' + view_name + ') WHERE id = ' + id + CHAR(10) + CHAR(13) FROM university_members

EXEC @SQL

Предупреждение! Этот код не тестировался. Это просто намек ...

Dynamic SQl - единственный способ сделать это, поэтому это плохой выбор дизайна. Прочтите следующую статью, если вам необходимо использовать динамический SQl для защиты ваших данных. http://www.sommarskog.se/dynamic_sql.html

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

Если вам нужно определить значение в какой-то момент, сделайте это, когда вам это нужно. Попытка сохранить подобное вычисленное значение синхронизированным с вашими данными почти всегда чревата проблемами - неточностью, дополнительными накладными расходами и т. д.

Очень редко возникают ситуации, когда сохранение такого значения необходимо или дает преимущество, и обычно это происходит в очень больших хранилищах данных или системах с ЧРЕЗВЫЧАЙНО высокой пропускной способностью. Это не то, с чем может столкнуться школа или университет.

Другие вопросы по теме