У меня есть таблица с полем 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, но приветствуются кроссплатформенные ответы.


Для этого вам нужно будет сделать это как немного динамического 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, является признаком проблемы с самой конструкцией. Я также отмечу, что хранение агрегата в такой таблице, скорее всего, является еще одним плохим выбором дизайна.
Если вам нужно определить значение в какой-то момент, сделайте это, когда вам это нужно. Попытка сохранить подобное вычисленное значение синхронизированным с вашими данными почти всегда чревата проблемами - неточностью, дополнительными накладными расходами и т. д.
Очень редко возникают ситуации, когда сохранение такого значения необходимо или дает преимущество, и обычно это происходит в очень больших хранилищах данных или системах с ЧРЕЗВЫЧАЙНО высокой пропускной способностью. Это не то, с чем может столкнуться школа или университет.