[tsql] SQL보기-변수가 없습니까?

뷰 내에서 변수를 선언 할 수 있습니까? 예를 들면 :

Declare @SomeVar varchar(8) = 'something'

나에게 구문 오류를 제공합니다.

키워드 ‘Declare’근처에 잘못된 구문이 있습니다.



답변

당신이 올바른지. 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를 사용하여 표현식을 정의 할 수 있습니다. 그런 다음 간단한 하위 선택을 수행하여 해당 정의에 액세스하십시오.

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)


답변

편집 : @bummi가 지적한대로 잘못된 이전 답변에 CTE를 사용해 보았습니다. 이 옵션은 대신 작동합니다.

다음은이 문제를 해결하기 위해 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 엔진이 JOIN을 중심으로 효과적인 실행 계획을 구축 할 수 있고 필요한 경우 인덱스를 추가 할 수도 있기 때문에 성능 측면에서 매우 유용합니다.

함수 (또는 인라인 계산 된 값) 사용의 단점은 모든 잠재력에 대해 콜 아웃이 발생한다는 것입니다. 반환되는 행에 비용이 많이 든다는 것입니다. 왜? SQL은 먼저 계산 된 값으로 전체 데이터 세트를 만든 다음 해당 데이터 세트에 WHERE 절을 적용해야하기 때문입니다.

10 개 중 9 번은 쿼리에서 동적으로 계산 된 셀 값이 필요하지 않습니다. 필요한 것이 무엇인지 파악한 다음이를 지원하는 데이터 모델을 설계하고 해당 데이터 모델을 반동적 데이터 (예 : 일괄 작업을 통해)로 채우고 SQL 엔진을 사용하여 표준 SQL을 통해 무거운 작업을 수행하는 것이 훨씬 좋습니다. .


답변

예, 맞습니다. 뷰에 변수를 사용할 수 없습니다 (다른 제한 사항도 있음).

결과를 select 문으로 바꿀 수있는 경우 뷰를 사용할 수 있습니다.


답변

내가하는 일은 테이블 변수와 동일한 선택을 수행하는 뷰를 만들고 해당 뷰를 두 번째 뷰에 연결하는 것입니다. 따라서보기는 다른보기에서 선택할 수 있습니다. 이것은 동일한 결과를 얻습니다.