Подтвердить что ты не робот

Представления SQL - нет переменных?

Можно ли объявить переменную в представлении? Например:

Declare @SomeVar varchar(8) = 'something'

дает синтаксическую ошибку:

Неправильный синтаксис рядом с ключевым словом "Объявить".

4b9b3361

Ответ 1

Вы правы. Локальные переменные не допускаются в 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

Ответ 2

Вы можете использовать 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)

Ответ 3

РЕДАКТИРОВАТЬ: Я попытался использовать 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

Ответ 4

Использование таких функций, как упомянутый spencer7593, является правильным подходом для динамических данных. Для статических данных более эффективный подход, совместимый с дизайном SQL-данных (по сравнению с анти-шаблоном массивного процедурного кода в sprocs), заключается в создании отдельной таблицы со статическими значениями и присоединении к ней. Это чрезвычайно выгодно с точки зрения перспективы, поскольку SQL Engine может создавать эффективные планы выполнения вокруг JOIN, и у вас также есть возможность добавлять индексы, если это необходимо.

Недостатком использования функций (или любых встроенных вычисленных значений) является выключение происходит для каждой возвращаемой потенциальной строки, что является дорогостоящим. Зачем? Поскольку SQL должен сначала создать полный набор данных с вычисленными значениями, а затем применить предложение WHERE к этому набору данных.

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

Ответ 5

Да, это правильно, вы не можете иметь переменные в представлениях (есть и другие ограничения).

Представления могут использоваться для случаев, когда результат может быть заменен на оператор select.

Ответ 6

@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

Ответ 7

Я создаю представление, которое выполняет тот же выбор, что и переменная таблицы, и ссылку, которая просматривает во втором представлении. Таким образом, представление может выбирать из другого представления. Это дает тот же результат

Ответ 8

Как часто вам нужно обновлять вид? У меня похожий случай, когда новые данные появляются раз в месяц; затем я должен загрузить его, и в процессе загрузки я должен создать новые таблицы. В этот момент я изменяю свое мнение, чтобы рассмотреть изменения. Я использовал в качестве базы информацию в этом другом вопросе:

Создать представление динамически и синонимов

Там предлагается сделать это двумя способами:

  1. используя синонимы.
  2. Использование динамического SQL для создания представления (это то, что помогло мне достичь моего результата).