Можно ли объявить переменную в представлении? Например:
Declare @SomeVar varchar(8) = 'something'
дает синтаксическую ошибку:
Неправильный синтаксис рядом с ключевым словом "Объявить".
Можно ли объявить переменную в представлении? Например:
Declare @SomeVar varchar(8) = 'something'
дает синтаксическую ошибку:
Неправильный синтаксис рядом с ключевым словом "Объявить".
Вы правы. Локальные переменные не допускаются в VIEW.
Вы можете установить локальную переменную в функции с табличной оценкой, которая возвращает набор результатов (например, это делает вид.)
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
Использование таких функций, как упомянутый spencer7593, является правильным подходом для динамических данных. Для статических данных более эффективный подход, совместимый с дизайном SQL-данных (по сравнению с анти-шаблоном массивного процедурного кода в sprocs), заключается в создании отдельной таблицы со статическими значениями и присоединении к ней. Это чрезвычайно выгодно с точки зрения перспективы, поскольку SQL Engine может создавать эффективные планы выполнения вокруг JOIN, и у вас также есть возможность добавлять индексы, если это необходимо.
Недостатком использования функций (или любых встроенных вычисленных значений) является выключение происходит для каждой возвращаемой потенциальной строки, что является дорогостоящим. Зачем? Поскольку SQL должен сначала создать полный набор данных с вычисленными значениями, а затем применить предложение WHERE к этому набору данных.
Девять раз из десяти вам не нужны динамически рассчитанные значения ячеек в ваших запросах. Его гораздо лучше понять, что вам нужно, а затем создать модель данных, которая ее поддерживает, и заполнить эту модель данных полудинамическими данными (например, с помощью пакетных заданий) и использовать SQL Engine для выполнения тяжелой работы с помощью стандартного SQL.
Да, это правильно, вы не можете иметь переменные в представлениях (есть и другие ограничения).
Представления могут использоваться для случаев, когда результат может быть заменен на оператор select.
@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
Я создаю представление, которое выполняет тот же выбор, что и переменная таблицы, и ссылку, которая просматривает во втором представлении. Таким образом, представление может выбирать из другого представления. Это дает тот же результат
Как часто вам нужно обновлять вид? У меня похожий случай, когда новые данные появляются раз в месяц; затем я должен загрузить его, и в процессе загрузки я должен создать новые таблицы. В этот момент я изменяю свое мнение, чтобы рассмотреть изменения. Я использовал в качестве базы информацию в этом другом вопросе:
Создать представление динамически и синонимов
Там предлагается сделать это двумя способами: