Можно ли объявить переменную в представлении? Например:
Declare @SomeVar varchar(8) = 'something'
дает мне синтаксическую ошибку:
Неправильный синтаксис рядом с ключевым словом Declare.
Ты прав. Локальные переменные не допускаются в ВИДЕ.
Вы можете установить локальную переменную в функции с табличным значением, которая возвращает набор результатов (как это делает представление).
http://msdn.microsoft.com/en-us/library/ms191165.aspx
например
CREATE FUNCTION dbo.udf_foo()
RETURNS @ret TABLE (col INT)
AS
BEGIN
DECLARE @myvar INT;
SELECT @myvar = 1;
INSERT INTO @ret SELECT @myvar;
RETURN;
END;
GO
SELECT * FROM dbo.udf_foo();
GO
Вы можете использовать WITH для определения ваших выражений. Затем выполните простой Sub-SELECT для доступа к этим определениям.
CREATE VIEW MyView AS WITH MyVars (SomeVar, Var2) AS ( SELECT 'something' AS 'SomeVar', 123 AS 'Var2' ) SELECT * FROM MyTable WHERE x = (SELECT SomeVar FROM MyVars)
источник
РЕДАКТИРОВАТЬ: Я попытался использовать CTE в своем предыдущем ответе, который был неверным, как указано @bummi. Вместо этого должен работать этот вариант:
Вот один из вариантов использования CROSS APPLY для решения этой проблемы:
SELECT st.Value, Constants.CONSTANT_ONE, Constants.CONSTANT_TWO FROM SomeTable st CROSS APPLY ( SELECT 'Value1' AS CONSTANT_ONE, 'Value2' AS CONSTANT_TWO ) Constants
источник
@datenstation имеет правильную концепцию. Вот рабочий пример, в котором CTE используется для кэширования имен переменных:
CREATE VIEW vwImportant_Users AS WITH params AS ( SELECT varType='%Admin%', varMinStatus=1) SELECT status, name FROM sys.sysusers, params WHERE status > varMinStatus OR name LIKE varType SELECT * FROM vwImportant_Users
также через
JOIN
WITH params AS ( SELECT varType='%Admin%', varMinStatus=1) SELECT status, name FROM sys.sysusers INNER JOIN params ON 1=1 WHERE status > varMinStatus OR name LIKE varType
также через
CROSS APPLY
WITH params AS ( SELECT varType='%Admin%', varMinStatus=1) SELECT status, name FROM sys.sysusers CROSS APPLY params WHERE status > varMinStatus OR name LIKE varType
источник
Использование функций, упомянутых в spencer7593, является правильным подходом для динамических данных. Для статических данных более производительный подход, который согласуется с дизайном данных SQL (в отличие от анти-шаблона написания массивного процедурного кода в sprocs), заключается в создании отдельной таблицы со статическими значениями и присоединении к ней. Это чрезвычайно выгодно с точки зрения производительности, поскольку SQL Engine может строить эффективные планы выполнения на основе JOIN, и вы также можете добавлять индексы, если это необходимо.
Недостатком использования функций (или любых встроенных вычисляемых значений) является то, что выноска выполняется для каждого потенциального возвращаемой строки, что дорого. Почему? Поскольку SQL должен сначала создать полный набор данных с вычисленными значениями, а затем применить предложение WHERE к этому набору данных.
В девяти случаях из десяти вам не понадобятся динамически вычисляемые значения ячеек в ваших запросах. Гораздо лучше выяснить, что вам понадобится, затем разработать модель данных, которая ее поддерживает, и заполнить эту модель данных полудинамическими данными (например, с помощью пакетных заданий) и использовать SQL Engine для выполнения тяжелой работы через стандартный SQL. .
источник
Да, это правильно, у вас не может быть переменных в представлениях (есть и другие ограничения).
Представления можно использовать в случаях, когда результат можно заменить оператором выбора.
источник
Что я делаю, так это создаю представление, которое выполняет тот же выбор, что и переменная таблицы, и связываю это представление со вторым представлением. Таким образом, представление может выбирать из другого представления. Это дает тот же результат
источник
Как часто вам нужно обновлять вид? У меня похожий случай, когда новые данные приходят раз в месяц; затем мне нужно загрузить его, и в процессе загрузки я должен создавать новые таблицы. В этот момент я меняю свое мнение, чтобы учесть изменения. Я использовал в качестве основы информацию в этом другом вопросе:
Создание динамического просмотра и синонимов
Там предлагается сделать это двумя способами:
источник