Как использовать имя представления, хранящееся в поле для запроса SQL? - PullRequest
1 голос
/ 02 декабря 2008

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

Пример:

СТОЛ университета_членов

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

Ответы [ 4 ]

2 голосов
/ 02 декабря 2008

Чтобы сделать это, вам нужно сделать это как динамический 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)
0 голосов
/ 02 декабря 2008

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

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

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

0 голосов
/ 02 декабря 2008

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

0 голосов
/ 02 декабря 2008

На мой взгляд, вы можете сгенерировать код 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

Внимание! Этот код не проверен. Это просто подсказка ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...