[sql] SQL의 뷰에 매개 변수를 전달할 수 있습니까?

Microsoft SQL Server의 뷰에 매개 변수를 전달할 수 있습니까?

create view다음과 같은 방법으로 시도했지만 작동하지 않습니다.

create or replace view v_emp(eno number) as select * from emp where emp_id=&eno;



답변

이미 언급했듯이 할 수 없습니다.

가능한 해결책은 다음과 같은 저장 함수를 구현하는 것입니다.

CREATE FUNCTION v_emp (@pintEno INT)
RETURNS TABLE
AS
RETURN
   SELECT * FROM emp WHERE emp_id=@pintEno;

이를 통해 다음과 같이 일반보기로 사용할 수 있습니다.

SELECT * FROM v_emp(10)


답변

불행히도 원하는 것을 달성하는 두 가지 방법이 있습니다.

원하는 매개 변수를 사용하고 쿼리 결과를 반환하는 테이블 값 사용자 정의 함수를 만들 수 있습니다

또는 거의 동일한 작업을 수행 할 수 있지만 사용자 정의 함수 대신 저장 프로 시저를 만들 수 있습니다.

예를 들어

저장 프로시 저는 다음과 같습니다

CREATE PROCEDURE s_emp
(
    @enoNumber INT
)
AS
SELECT
    *
FROM
    emp
WHERE
    emp_id=@enoNumber

또는 사용자 정의 함수는 다음과 같습니다

CREATE FUNCTION u_emp
(
    @enoNumber INT
)
RETURNS TABLE
AS
RETURN
(
    SELECT
        *
    FROM
        emp
    WHERE
        emp_id=@enoNumber
)


답변

Mladen Prajdic가 말했듯이 당신은 할 수 없습니다. 뷰를 테이블 또는 테이블 조합에서 “정적 필터”로 생각하십시오. 예를 들어 뷰는 테이블을 결합 할 수 OrderCustomer당신의 행의 새로운 “테이블”을 얻을 수 있도록 Order고객의 이름과 고객 번호 (테이블의 조합)을 포함하는 새로운 컬럼과 함께. 또는 Order테이블 에서 처리되지 않은 주문 만 선택하는 뷰를 작성할 수 있습니다 (정적 필터).

그런 다음 다른 “정상”테이블에서 선택하는 것처럼보기에서 선택합니다. “정적되지 않은”모든 필터링은보기 외부에서 수행해야합니다 (예 : “밀러라는 고객의 모든 주문 가져 오기”또는 “처리되지 않은 주문 가져 오기) 12 월 24 일에 나왔습니다 “).


답변

일반적으로 뷰는 매개 변수화되지 않습니다. 그러나 항상 일부 매개 변수를 주입 할 수 있습니다. 예를 들어 세션 컨텍스트 를 사용하는 경우 :

CREATE VIEW my_view
AS
SELECT *
FROM tab
WHERE num = SESSION_CONTEXT(N'my_num');

기도:

EXEC sp_set_session_context 'my_num', 1;
SELECT * FROM my_view;

그리고 또 다른:

EXEC sp_set_session_context 'my_num', 2;
SELECT * FROM my_view;

DBFiddle 데모

Oracle에도 동일하게 적용됩니다 (물론 컨텍스트 함수의 구문이 다릅니다).


답변

보기에 매개 변수가 필요한 이유는 무엇입니까? 당신은 WHERE절을 사용할 수 있습니다 .

create view v_emp as select * from emp ;

쿼리가 작업을 수행해야합니다.

select * from v_emp where emp_id=&eno;


답변

저장 프로시 저나 함수없이 해킹하는 방법은 데이터베이스에 Id, Param1, Param2 등의 설정 테이블을 만드는 것입니다. Id = 1, Param1 = 0, Param2 값을 포함하는 행을 해당 테이블에 삽입하십시오. = 0 등입니다. 그런 다음 뷰에서 해당 테이블에 조인을 추가하여 원하는 효과를 만들고 뷰를 실행하기 전에 설정 테이블을 업데이트 할 수 있습니다. 여러 사용자가 설정 테이블을 업데이트하고 동시에보기를 실행하는 경우 문제가 발생할 수 있지만 그렇지 않으면 제대로 작동합니다. 다음과 같은 것 :

CREATE VIEW v_emp
AS
SELECT      *
FROM        emp E
INNER JOIN  settings S
ON          S.Id = 1 AND E.emp_id = S.Param1


답변

아니. 그런 다음 매개 변수를 전달할 수있는 사용자 정의 함수를 사용해야합니다.