[SQL] 우리는 SQL에서보기로 매개 변수를 전달할 수 있습니까?
SQL우리는 SQL에서보기로 매개 변수를 전달할 수 있습니까?
우리는 마이크로 소프트 SQL 서버에서 볼 수있는 매개 변수를 전달 할 수 있습니까?
나는 다음과 같은 방법으로 뷰를 만들려고했지만 작동하지 않습니다 :
create or replace view v_emp(eno number) as select * from emp where emp_id=&eno;
해결법
-
==============================
1.이미 언급 한 바와 같이 당신은 할 수 없습니다.
이미 언급 한 바와 같이 당신은 할 수 없습니다.
가능한 솔루션처럼 저장 기능을 구현하는 것입니다 :
CREATE FUNCTION v_emp (@pintEno INT) RETURNS TABLE AS RETURN SELECT * FROM emp WHERE emp_id=@pintEno;
이것은 당신이, 일반보기로 사용할 수 있습니다 :
SELECT * FROM v_emp(10)
-
==============================
2.당신이보기를 사용하여 수행 할 수 있습니다 불행하게도 어느 쪽도 원하지 않는 무엇을 달성하기 위해 2 가지 방법이 있습니다.
당신이보기를 사용하여 수행 할 수 있습니다 불행하게도 어느 쪽도 원하지 않는 무엇을 달성하기 위해 2 가지 방법이 있습니다.
당신도 당신이 원하는 매개 변수를 사용하고 쿼리 결과를 반환하는 테이블 반환 사용자 정의 함수를 만들 수 있습니다
또는 당신은 거의 같은 일을 대신 사용자 정의 함수의 저장 프로 시저를 만들 수 있습니다.
예를 들면
저장 프로 시저처럼 보일 것이다
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 )
-
==============================
3.믈라덴 Prajdic 말했듯이 아니 당신은 할 수 없습니다. 테이블에 "정적 필터"또는 테이블의 조합으로 볼 생각. 예를 들면 : 당신이 고객의 이름과 고객 번호 (테이블의 조합)을 포함하는 새로운 컬럼과 함께 주문에서 행의 새로운 "테이블"을 얻을 수 있도록보기 테이블 주문을 결합하여 고객 수 있습니다. 아니면보기를 만들 수 있습니다 순서 표 (정적 필터)에서 선택에만 처리되지 않은 주문.
믈라덴 Prajdic 말했듯이 아니 당신은 할 수 없습니다. 테이블에 "정적 필터"또는 테이블의 조합으로 볼 생각. 예를 들면 : 당신이 고객의 이름과 고객 번호 (테이블의 조합)을 포함하는 새로운 컬럼과 함께 주문에서 행의 새로운 "테이블"을 얻을 수 있도록보기 테이블 주문을 결합하여 고객 수 있습니다. 아니면보기를 만들 수 있습니다 순서 표 (정적 필터)에서 선택에만 처리되지 않은 주문.
당신이 다른 "정상"테이블에서 선택하는 것처럼 그런 다음보기에서 선택 것 - "밀러라는 고객을위한 주문을 모두 가져 오기"(뷰 외부에서 수행처럼해야 필터링 모든 "비 정적을"또는 "처리되지 않은 주문을 받기 즉, 12 월 24 일 ")에 들어 왔습니다.
-
==============================
4.일반적으로보기는 파라미터되지 않습니다. 하지만 당신은 항상 어떤 매개 변수를 주입 할 수있다. 예를 들어 세션 컨텍스트를 사용하여 :
일반적으로보기는 파라미터되지 않습니다. 하지만 당신은 항상 어떤 매개 변수를 주입 할 수있다. 예를 들어 세션 컨텍스트를 사용하여 :
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;
DB 휘티 d 혀라도
같은 오라클 (상황에 맞는 기능을위한 과정의 구문이 다른)에 대해 적용됩니다.
-
==============================
5.왜보기에 매개 변수를 필요합니까? 당신은 WHERE 절을 사용할 수 있습니다.
왜보기에 매개 변수를 필요합니까? 당신은 WHERE 절을 사용할 수 있습니다.
create view v_emp as select * from emp ;
당신의 쿼리 작업을 수행해야합니다
select * from v_emp where emp_id=&eno;
-
==============================
6.해키 방법은 값 식 1, Param1을 = 0과 Param2를 포함하는 테이블에 열 등 아이디, Param1을,과 Param2 삽입하여, 데이터베이스의 설정 테이블을 생성하는 것입니다 저장 프로 시저 또는 함수없이 행을 수행하는 = 0, 등 그럼 당신은 원하는 효과를 만들 수있는보기에 해당 테이블에 조인 추가하고보기를 실행하기 전에 설정 테이블을 업데이트 할 수 있습니다. 당신은 설정 테이블을 업데이트하고 잘못을 갈 수있는 동시에 일을보기를 실행하는 여러 사용자가 있지만 경우 그렇지 않으면 확인을 작동합니다. 뭔가 같은 :
해키 방법은 값 식 1, Param1을 = 0과 Param2를 포함하는 테이블에 열 등 아이디, Param1을,과 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
-
==============================
7.아니. 그런 다음에 매개 변수를 전달할 수있는에 사용자 정의 함수를 사용해야하는 경우.
아니. 그런 다음에 매개 변수를 전달할 수있는에 사용자 정의 함수를 사용해야하는 경우.
-
==============================
8.아니,보기는 테이블에서 선택에 더 다르게 조회하지 않습니다.
아니,보기는 테이블에서 선택에 더 다르게 조회하지 않습니다.
당신이 원하는 하나 이상의 매개 변수 테이블 반환 사용자 정의 함수를 사용하는 일을합니다
-
==============================
9.뷰는 더 미리 정의 된 'SELECT'문 이상의 아무것도 아니다. 유일한 진짜 대답이 될 것이다 그래서 : 아니오, 당신은 할 수 없습니다.
뷰는 더 미리 정의 된 'SELECT'문 이상의 아무것도 아니다. 유일한 진짜 대답이 될 것이다 그래서 : 아니오, 당신은 할 수 없습니다.
나는 당신이 정말로 원하는 것은 당신이 매개 변수를 선택하고 데이터를 수신을 포함하여, 당신이 원하는 무엇이든 할 유효한 SQL을 사용할 수 있습니다 원칙적으로 저장 프로 시저를 만들 생각합니다.
당신이 정말 만 그래도보기에서 선택하면 where 절을 추가해야합니다,하지만 당신이 정말로 확인하기 위해 충분한 정보를 제공하지 않은 것으로 보인다.
-
==============================
10.우리는 입력 매개 변수가있는 저장 프로 시저를 작성하고 다음보기에서 결과 집합을 얻기 위해이 저장 프로 시저를 사용할 수 있습니다. 아래의 예를 참조.
우리는 입력 매개 변수가있는 저장 프로 시저를 작성하고 다음보기에서 결과 집합을 얻기 위해이 저장 프로 시저를 사용할 수 있습니다. 아래의 예를 참조.
저장 프로 시저입니다
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%')
-
==============================
11.내가 알기로보기는 select 명령과 같이 할 수 있습니다. 당신은 또한이 같은 경우 문에서 예를 들어,이 선택에 매개 변수를 추가 할 수 있습니다 :
내가 알기로보기는 select 명령과 같이 할 수 있습니다. 당신은 또한이 같은 경우 문에서 예를 들어,이 선택에 매개 변수를 추가 할 수 있습니다 :
WHERE (exam_id = @var)
-
==============================
12.아니,보기는 정적이다. 당신이 (SQL Server의 버전에 따라) 할 수있는 한 가지 지표 전망이다.
아니,보기는 정적이다. 당신이 (SQL Server의 버전에 따라) 할 수있는 한 가지 지표 전망이다.
당신의 예에서 인덱싱 된 뷰는 단순히에 인덱스와 테이블을 쿼리에 이점이 없습니다 (단 하나의 테이블을 쿼리),하지만 당신의 가입 조건이있는 테이블에 조인을 많이하고 있다면, 인덱스 된 뷰 성능을 크게 향상시킬 수 있습니다.
-
==============================
13.이 기능을 사용하지 않으려면, 다음과 같이 사용할 수 있습니다
이 기능을 사용하지 않으려면, 다음과 같이 사용할 수 있습니다
-- 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 )
그것이 도움이되기를 바랍니다
-
==============================
14.아니 당신이보기에서 프로 시저에 매개 변수를 전달할 수 있습니다
아니 당신이보기에서 프로 시저에 매개 변수를 전달할 수 있습니다
-
==============================
15.여기에 지금까지 보지 못한 옵션은 다음과 같습니다
여기에 지금까지 보지 못한 옵션은 다음과 같습니다
그냥 당신이보기에에 제한 할 열을 추가 :
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)
-
==============================
16.당신은 우회 바로보기, SQL의 의지 와인과 외침을 실행하지만, 그냥 이렇게하고 실행할 수 있습니다! 당신은 저장할 수 없습니다.
당신은 우회 바로보기, SQL의 의지 와인과 외침을 실행하지만, 그냥 이렇게하고 실행할 수 있습니다! 당신은 저장할 수 없습니다.
create or replace view v_emp(eno number) as select * from emp where (emp_id = @Parameter1);
-
==============================
17.귀하의보기는 매개 변수를 포함하는 일부 외부 테이블을 참조 할 수 있습니다.
귀하의보기는 매개 변수를 포함하는 일부 외부 테이블을 참조 할 수 있습니다.
다른 사람이 언급 한 바와 같이, 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
또한 가입을 통해
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이 적용을 통해
WITH params AS ( SELECT varType='%Admin%', varMinStatus=1) SELECT status, name FROM sys.sysusers CROSS APPLY params WHERE status > varMinStatus OR name LIKE varType
-
==============================
18.나는 아직 시도하지 않은 것이라는 생각을 가지고있다. 넌 할 수있어:
나는 아직 시도하지 않은 것이라는 생각을 가지고있다. 넌 할 수있어:
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)
귀하의 매개 변수를 저장하고 구성 테이블에 변경됩니다.
-
==============================
19.다음과 같이 나는 나의 요구에이 작업을 실현
다음과 같이 나는 나의 요구에이 작업을 실현
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
from https://stackoverflow.com/questions/1687279/can-we-pass-parameters-to-a-view-in-sql by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 데이터베이스 커서를 사용의 이점은 무엇입니까? (0) | 2020.05.07 |
---|---|
[SQL] 어떻게 PostgreSQL을에 정렬과 행의 고정 번호를 삭제합니까? (0) | 2020.05.07 |
[SQL] SQL WHERE ID IN (ID1, ID2, ..., IDN) (0) | 2020.05.07 |
[SQL] MYSQL을 사용하여 난수를 생성 (0) | 2020.05.07 |
[SQL] 임시 쿼리를 분산 가능하게하는 방법 (0) | 2020.05.07 |