157

Microsoft SQL Server のビューにパラメーターを渡すことはできますか?

次の方法で試してみましたが、うまくいきcreate viewません。

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

21 に答える 21

150

すでに述べたように、あなたはできません。

考えられる解決策は、次のようなストアド関数を実装することです。

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

これにより、次のようにして通常のビューとして使用できます。

SELECT * FROM v_emp(10)
于 2009-11-06T13:14:33.997 に答える
39

あなたが望むものを達成するための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
)
于 2009-11-06T13:10:06.127 に答える
14

Mladen Prajdicが言ったように、できません。ビューは、テーブルまたはテーブルの組み合わせの「静的フィルター」と考えてください。例:ビューはテーブルOrderを結合する場合があるため、顧客の名前と顧客番号(テーブルの組み合わせ)を含む新しい列とともにCustomer、行の新しい「テーブル」を取得します。Orderまたは、テーブルから未処理の注文のみを選択するビューを作成することもできOrderます(静的フィルター)。

次に、他の「通常の」テーブルから選択するのと同じように、ビューから選択します。すべての「非静的」フィルタリングは、ビューの外部で実行する必要があります(「ミラーと呼ばれる顧客のすべての注文を取得する」や「未処理の注文を取得する」など)。それは12月24日にやってきた」)。

于 2009-11-06T13:03:01.867 に答える
8

ストアド プロシージャや関数を使用せずにこれを行うハックな方法は、データベースに 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
于 2012-06-26T10:00:56.110 に答える
6

番号。パラメータを渡すことができるユーザー定義関数を使用する必要がある場合。

于 2009-11-06T12:32:55.470 に答える
5

ビューは、事前定義された「SELECT」ステートメントにすぎません。したがって、唯一の本当の答えは次のようになります。いいえ、できません。

あなたが本当にやりたいのは、ストアドプロシージャを作成することだと思います。ここでは、原則として、パラメータの受け入れやデータの選択など、任意の有効なSQLを使用して必要な処理を実行できます。

ビューから選択するときに、実際にはwhere句を追加するだけでよいようですが、確かに十分な詳細を提供していませんでした。

于 2009-11-06T13:16:02.887 に答える
5

いいえ、ビューはテーブルからのSELECTと同じように照会されます。

必要なことを行うには、1つ以上のパラメーターを持つテーブル値のユーザー定義関数を使用します

于 2009-11-06T13:07:39.043 に答える
5

私が知っているように、viewはselectコマンドのようなものです。たとえば、次のような where ステートメントで、この select にパラメーターを追加することもできます。

 WHERE  (exam_id = @var)
于 2012-09-16T19:01:45.137 に答える
5

入力パラメーターを使用してストアド プロシージャを記述し、そのストアド プロシージャを使用してビューから結果セットを取得できます。以下の例を参照してください。

ストアドプロシージャは

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%')  
于 2011-04-07T14:34:03.007 に答える
4

いいえ、ビューは静的です。(SQl サーバーのバージョンに応じて) できることの 1 つは、ビューのインデックス作成です。

あなたの例 (1 つのテーブルのみをクエリする) では、インデックス付きのビューには、インデックスを使用してテーブルをクエリするだけの利点はありませんが、結合条件を使用してテーブルで多くの結合を実行している場合、インデックス付きのビューはパフォーマンスを大幅に向上させることができます。

于 2009-11-06T17:52:17.687 に答える
3

いいえ、ビュー内のプロシージャにパラメータを渡すことはできません

于 2009-11-06T13:14:31.830 に答える
1

ビューを実行するためだけにバイパスすることができます.SQLはワインと泣きますが、これを実行して実行してください! 保存できません。

create or replace view v_emp(eno number) as select * from emp where (emp_id = @Parameter1);
于 2016-04-06T16:31:13.330 に答える
1

ビューは、パラメーターを含む外部テーブルを参照できます。

他の人が述べたように、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
于 2017-12-12T22:32:45.273 に答える