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가 말했듯이 당신은 할 수 없습니다. 뷰를 테이블 또는 테이블 조합에서 "정적 필터"로 생각하십시오. 예를 들어 뷰는 테이블을 결합 할 수 Order
및 Customer
당신의 행의 새로운 "테이블"을 사용할 수 있도록 Order
고객의 이름과 고객 번호 (테이블의 조합)를 포함하는 새로운 경기장과 함께. 또는 Order
테이블 에서 처리되지 않은 주문 만 선택하는 뷰를 사용할 수 있습니다 (정적 필터).
그런 다음 다른 "정상"테이블에서 선택하는 것처럼보기에서 선택합니다. "정적되지 않은"모든 필터링은 외부에서 수행해야합니다 (예 : "밀러라는 고객의 모든 주문 가져 오기"또는 "처리되지 않은 주문 가져 오기").
일반적으로 뷰는 변수화되지 않습니다. 그러나 항상 일부 매개 변수를 사용합니다. 예를 들어 세션 인스턴스 를 사용하는 경우 :
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에도 동일하게 적용됩니다.
저장 프로시 저나 함수없이 해킹하는 방법은 데이터베이스에 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
보기에 매개 변수가 필요한 이유는 무엇입니까? 당신은 WHERE
절을 사용할 수 있습니다 .
create view v_emp as select * from emp ;
쿼리가 작업을 수행해야합니다.
select * from v_emp where emp_id=&eno;
아니. 그런 다음 매개 변수를 많은 사용자 정의 함수를 사용합니다.
아니요, 뷰는 테이블에서 SELECTing과 다르게 쿼리되지 않습니다.
원하는 것을 수행하려는 하나 이상의 변수와 함께 테이블 반환 사용자 정의 함수를 사용하십시오.
뷰는 미리 정의 된 'SELECT'문에 지나지 않습니다. 유일한 대답은 '아니요'입니다.
실제로 원하는 것은 저장 프로 시저를 만드는 것입니다. 원칙적으로 유효한 규칙 변수를 사용하여 수락하여 원하는 모든 작업을 수행 할 수 있습니다.
뷰에서 선택할 때 절을 추가해야 할 것 같지만 확실하게 충분한 세부 정보를 제공 할 수 있습니다.
입력 변수는 다음 해당 스토어드 프로 시저를 사용하여 뷰에서 결과 세트를 얻을 수 있습니다. 아래 예를 참조하십시오.
저장 프로시 저는
CREATE PROCEDURE [dbo].[sp_Report_LoginSuccess] -- [sp_Report_LoginSuccess] '01/01/2010','01/30/2010'
@fromDate datetime,
@toDate datetime,
@RoleName varchar(50),
@Success int
as
If @RoleName != 'All'
Begin
If @Success!=2
Begin
--fetch based on true or false
Select * from vw_Report_LoginSuccess
where logindatetime between dbo.DateFloor(@fromDate) and dbo.DateSieling(@toDate)
And RTrim(Upper(RoleName)) = RTrim(Upper(@RoleName)) and Success=@Success
End
Else
Begin
-- fetch all
Select * from vw_Report_LoginSuccess
where logindatetime between dbo.DateFloor(@fromDate) and dbo.DateSieling(@toDate)
And RTrim(Upper(RoleName)) = RTrim(Upper(@RoleName))
End
End
Else
Begin
If @Success!=2
Begin
Select * from vw_Report_LoginSuccess
where logindatetime between dbo.DateFloor(@fromDate) and dbo.DateSieling(@toDate)
and Success=@Success
End
Else
Begin
Select * from vw_Report_LoginSuccess
where logindatetime between dbo.DateFloor(@fromDate) and dbo.DateSieling(@toDate)
End
End
결과 집합을 얻을 수있는 관점은
CREATE VIEW [dbo].[vw_Report_LoginSuccess]
AS
SELECT '3' AS UserDetailID, dbo.tblLoginStatusDetail.Success, CONVERT(varchar, dbo.tblLoginStatusDetail.LoginDateTime, 101) AS LoginDateTime,
CONVERT(varchar, dbo.tblLoginStatusDetail.LogoutDateTime, 101) AS LogoutDateTime, dbo.tblLoginStatusDetail.TokenID,
dbo.tblUserDetail.SubscriberID, dbo.aspnet_Roles.RoleId, dbo.aspnet_Roles.RoleName
FROM dbo.tblLoginStatusDetail INNER JOIN
dbo.tblUserDetail ON dbo.tblLoginStatusDetail.UserDetailID = dbo.tblUserDetail.UserDetailID INNER JOIN
dbo.aspnet_UsersInRoles ON dbo.tblUserDetail.UserID = dbo.aspnet_UsersInRoles.UserId INNER JOIN
dbo.aspnet_Roles ON dbo.aspnet_UsersInRoles.RoleId = dbo.aspnet_Roles.RoleId
WHERE (dbo.tblLoginStatusDetail.Success = 0)
UNION all
SELECT dbo.tblLoginStatusDetail.UserDetailID, dbo.tblLoginStatusDetail.Success, CONVERT(varchar, dbo.tblLoginStatusDetail.LoginDateTime, 101)
AS LoginDateTime, CONVERT(varchar, dbo.tblLoginStatusDetail.LogoutDateTime, 101) AS LogoutDateTime, dbo.tblLoginStatusDetail.TokenID,
dbo.tblUserDetail.SubscriberID, dbo.aspnet_Roles.RoleId, dbo.aspnet_Roles.RoleName
FROM dbo.tblLoginStatusDetail INNER JOIN
dbo.tblUserDetail ON dbo.tblLoginStatusDetail.UserDetailID = dbo.tblUserDetail.UserDetailID INNER JOIN
dbo.aspnet_UsersInRoles ON dbo.tblUserDetail.UserID = dbo.aspnet_UsersInRoles.UserId INNER JOIN
dbo.aspnet_Roles ON dbo.aspnet_UsersInRoles.RoleId = dbo.aspnet_Roles.RoleId
WHERE (dbo.tblLoginStatusDetail.Success = 1) AND (dbo.tblUserDetail.SubscriberID LIKE N'P%')
내가 아는 것처럼보기는 명령과 같은 것을 선택할 수 있습니다. 예를 들어 다음과 같은 명령문 에서이 선택에 매개 변수를 추가 할 수도 있습니다.
WHERE (exam_id = @var)
아니요, 뷰는 정적입니다. SQl 서버 버전에 따라 수행 할 수있는 한 가지 작업은 뷰를 인덱싱하는 것입니다.
예 (한 테이블 만 쿼리)에서 현재 존재하는 뷰는 표시되는 데가있는 테이블을 쿼리하는 데 도움이되지 않지만, 조인 조건이있는 테이블에서 많은 조인을 수행하면 뷰가 성능을 크게 향상시킬 수 있습니다.
함수를 사용하지 않고 사용할 수 있습니다.
-- VIEW
CREATE VIEW [dbo].[vwPharmacyProducts]
AS
SELECT PharmacyId, ProductId
FROM dbo.Stock
WHERE (TotalQty > 0)
-- Use of view inside a stored procedure
CREATE PROCEDURE [dbo].[usp_GetProductByFilter]
( @pPharmacyId int ) AS
IF @pPharmacyId = 0 BEGIN SET @pPharmacyId = NULL END
SELECT P.[ProductId], P.[strDisplayAs] FROM [Product] P
WHERE (P.[bDeleted] = 0)
AND (P.[ProductId] IN (Select vPP.ProductId From vwPharmacyProducts vPP
Where vPP.PharmacyId = @pPharmacyId)
OR @pPharmacyId IS NULL
)
그것이 도움이되기를 바랍니다.
아니요 매개 변수를 뷰의 프로 시저에 많은 수 있습니다.
지금까지 보지 못한 옵션이 있습니다.
제한하려는 열을보기에 추가하기 만하면됩니다.
create view emp_v as (
select emp_name, emp_id from emp;
)
select emp_v.emp_name from emp_v
where emp_v.emp_id = (id to restrict by)
뷰를 실행하기 위해 우회 할 수 있습니다. SQL은 와인을 마시고 울지 만이 작업을 수행하고 실행합니다! 당신은 저장할 수 없습니다.
create or replace view v_emp(eno number) as select * from emp where (emp_id = @Parameter1);
뷰는 매개 변수가 포함 된 일부 외부 테이블을 참조 할 수 있습니다.
다른 사람들이 언급했듯이 SQL Server의 뷰는 외부 입력 매개 변수를 가질 수 없습니다. 그러나 CTE를 사용하여 뷰에서 변수를 쉽게 가짜로 만들 수 있습니다. SQL Server 버전에서 테스트 실행할 수 있습니다.
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
산출 산출 :
status name
12 dbo
0 db_accessadmin
0 db_securityadmin
0 db_ddladmin
또한 통해 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
아직 시도하지 않았다는 생각이 있습니다. 넌 할 수있어:
CREATE VIEW updated_customers AS
SELECT * FROM customer as aa
LEFT JOIN customer_rec as bb
ON aa.id = bb.customer_id
WHERE aa.updated_at between (SELECT start_date FROM config WHERE active = 1)
and (SELECT end_date FROM config WHERE active = 1)
매개 변수가 Config 테이블에 저장되고 변경됩니다.
나는 다음과 같이 내 필요에 대해이 작업을 깨달았습니다.
set nocount on;
declare @ToDate date = dateadd(month,datediff(month,0,getdate())-1,0)
declare @year varchar(4) = year(@ToDate)
declare @month varchar(2) = month(@ToDate)
declare @sql nvarchar(max)
set @sql = N'
create or alter view dbo.wTempLogs
as
select * from dbo.y2019
where
year(LogDate) = ''_year_''
and
month(LogDate) = ''_month_'' '
select @sql = replace(replace(@sql,'_year_',@year),'_month_',@month)
execute sp_executesql @sql
declare @errmsg nvarchar(max)
set @errMsg = @sql
raiserror (@errMsg, 0,1) with nowait
참고 URL : https://stackoverflow.com/questions/1687279/can-we-pass-parameters-to-a-view-in-sql
'IT' 카테고리의 다른 글
왜 우리는 Loggers를 static final로 선언합니까? (0) | 2020.07.20 |
---|---|
Perl 5의 함수 타입이 나쁜 이유는 무엇입니까? (0) | 2020.07.20 |
무시 된 파일을 마이너스 상태에서 유지 (0) | 2020.07.20 |
이해력은 이해 범위 이후에도 이름을 리 바인드합니다. (0) | 2020.07.20 |
판매에 HTTP 상태 코드 201 반환 (0) | 2020.07.20 |