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가 말했듯이 당신은 할 수 없습니다. 뷰를 테이블 또는 테이블 조합에서 “정적 필터”로 생각하십시오. 예를 들어 뷰는 테이블을 결합 할 수 Order
및 Customer
당신의 행의 새로운 “테이블”을 얻을 수 있도록 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;
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
답변
아니. 그런 다음 매개 변수를 전달할 수있는 사용자 정의 함수를 사용해야합니다.