복붙노트

[SQL] 우리는 SQL에서보기로 매개 변수를 전달할 수 있습니까?

SQL

우리는 SQL에서보기로 매개 변수를 전달할 수 있습니까?

우리는 마이크로 소프트 SQL 서버에서 볼 수있는 매개 변수를 전달 할 수 있습니까?

나는 다음과 같은 방법으로 뷰를 만들려고했지만 작동하지 않습니다 :

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

해결법

  1. ==============================

    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 가지 방법이 있습니다.

    당신이보기를 사용하여 수행 할 수 있습니다 불행하게도 어느 쪽도 원하지 않는 무엇을 달성하기 위해 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. ==============================

    3.믈라덴 Prajdic 말했듯이 아니 당신은 할 수 없습니다. 테이블에 "정적 필터"또는 테이블의 조합으로 볼 생각. 예를 들면 : 당신이 고객의 이름과 고객 번호 (테이블의 조합)을 포함하는 새로운 컬럼과 함께 주문에서 행의 새로운 "테이블"을 얻을 수 있도록보기 테이블 주문을 결합하여 고객 수 있습니다. 아니면보기를 만들 수 있습니다 순서 표 (정적 필터)에서 선택에만 처리되지 않은 주문.

    믈라덴 Prajdic 말했듯이 아니 당신은 할 수 없습니다. 테이블에 "정적 필터"또는 테이블의 조합으로 볼 생각. 예를 들면 : 당신이 고객의 이름과 고객 번호 (테이블의 조합)을 포함하는 새로운 컬럼과 함께 주문에서 행의 새로운 "테이블"을 얻을 수 있도록보기 테이블 주문을 결합하여 고객 수 있습니다. 아니면보기를 만들 수 있습니다 순서 표 (정적 필터)에서 선택에만 처리되지 않은 주문.

    당신이 다른 "정상"테이블에서 선택하는 것처럼 그런 다음보기에서 선택 것 - "밀러라는 고객을위한 주문을 모두 가져 오기"(뷰 외부에서 수행처럼해야 필터링 모든 "비 정적을"또는 "처리되지 않은 주문을 받기 즉, 12 월 24 일 ")에 들어 왔습니다.

  4. ==============================

    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. ==============================

    5.왜보기에 매개 변수를 필요합니까? 당신은 WHERE 절을 사용할 수 있습니다.

    왜보기에 매개 변수를 필요합니까? 당신은 WHERE 절을 사용할 수 있습니다.

    create view v_emp as select * from emp ;
    

    당신의 쿼리 작업을 수행해야합니다

    select * from v_emp where emp_id=&eno;
    
  6. ==============================

    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. ==============================

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

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

  8. ==============================

    8.아니,보기는 테이블에서 선택에 더 다르게 조회하지 않습니다.

    아니,보기는 테이블에서 선택에 더 다르게 조회하지 않습니다.

    당신이 원하는 하나 이상의 매개 변수 테이블 반환 사용자 정의 함수를 사용하는 일을합니다

  9. ==============================

    9.뷰는 더 미리 정의 된 'SELECT'문 이상의 아무것도 아니다. 유일한 진짜 대답이 될 것이다 그래서 : 아니오, 당신은 할 수 없습니다.

    뷰는 더 미리 정의 된 'SELECT'문 이상의 아무것도 아니다. 유일한 진짜 대답이 될 것이다 그래서 : 아니오, 당신은 할 수 없습니다.

    나는 당신이 정말로 원하는 것은 당신이 매개 변수를 선택하고 데이터를 수신을 포함하여, 당신이 원하는 무엇이든 할 유효한 SQL을 사용할 수 있습니다 원칙적으로 저장 프로 시저를 만들 생각합니다.

    당신이 정말 만 그래도보기에서 선택하면 where 절을 추가해야합니다,하지만 당신이 정말로 확인하기 위해 충분한 정보를 제공하지 않은 것으로 보인다.

  10. ==============================

    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. ==============================

    11.내가 알기로보기는 select 명령과 같이 할 수 있습니다. 당신은 또한이 같은 경우 문에서 예를 들어,이 선택에 매개 변수를 추가 할 수 있습니다 :

    내가 알기로보기는 select 명령과 같이 할 수 있습니다. 당신은 또한이 같은 경우 문에서 예를 들어,이 선택에 매개 변수를 추가 할 수 있습니다 :

     WHERE  (exam_id = @var)
    
  12. ==============================

    12.아니,보기는 정적이다. 당신이 (SQL Server의 버전에 따라) 할 수있는 한 가지 지표 전망이다.

    아니,보기는 정적이다. 당신이 (SQL Server의 버전에 따라) 할 수있는 한 가지 지표 전망이다.

    당신의 예에서 인덱싱 된 뷰는 단순히에 인덱스와 테이블을 쿼리에 이점이 없습니다 (단 하나의 테이블을 쿼리),하지만 당신의 가입 조건이있는 테이블에 조인을 많이하고 있다면, 인덱스 된 뷰 성능을 크게 향상시킬 수 있습니다.

  13. ==============================

    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. ==============================

    14.아니 당신이보기에서 프로 시저에 매개 변수를 전달할 수 있습니다

    아니 당신이보기에서 프로 시저에 매개 변수를 전달할 수 있습니다

  15. ==============================

    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. ==============================

    16.당신은 우회 바로보기, SQL의 의지 와인과 외침을 실행하지만, 그냥 이렇게하고 실행할 수 있습니다! 당신은 저장할 수 없습니다.

    당신은 우회 바로보기, SQL의 의지 와인과 외침을 실행하지만, 그냥 이렇게하고 실행할 수 있습니다! 당신은 저장할 수 없습니다.

    create or replace view v_emp(eno number) as select * from emp where (emp_id = @Parameter1);
    
  17. ==============================

    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. ==============================

    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. ==============================

    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
    
  20. from https://stackoverflow.com/questions/1687279/can-we-pass-parameters-to-a-view-in-sql by cc-by-sa and MIT license