Microsoft SQL Server のビューにパラメーターを渡すことはできますか?
次の方法で試してみましたが、うまくいきcreate view
ません。
create or replace view v_emp(eno number) as select * from emp where emp_id=&eno;
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)
あなたが望むものを達成するための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
)
Mladen Prajdicが言ったように、できません。ビューは、テーブルまたはテーブルの組み合わせの「静的フィルター」と考えてください。例:ビューはテーブルOrder
を結合する場合があるため、顧客の名前と顧客番号(テーブルの組み合わせ)を含む新しい列とともにCustomer
、行の新しい「テーブル」を取得します。Order
または、テーブルから未処理の注文のみを選択するビューを作成することもできOrder
ます(静的フィルター)。
次に、他の「通常の」テーブルから選択するのと同じように、ビューから選択します。すべての「非静的」フィルタリングは、ビューの外部で実行する必要があります(「ミラーと呼ばれる顧客のすべての注文を取得する」や「未処理の注文を取得する」など)。それは12月24日にやってきた」)。
ストアド プロシージャや関数を使用せずにこれを行うハックな方法は、データベースに 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
番号。パラメータを渡すことができるユーザー定義関数を使用する必要がある場合。
ビューは、事前定義された「SELECT」ステートメントにすぎません。したがって、唯一の本当の答えは次のようになります。いいえ、できません。
あなたが本当にやりたいのは、ストアドプロシージャを作成することだと思います。ここでは、原則として、パラメータの受け入れやデータの選択など、任意の有効なSQLを使用して必要な処理を実行できます。
ビューから選択するときに、実際にはwhere句を追加するだけでよいようですが、確かに十分な詳細を提供していませんでした。
いいえ、ビューはテーブルからのSELECTと同じように照会されます。
必要なことを行うには、1つ以上のパラメーターを持つテーブル値のユーザー定義関数を使用します
私が知っているように、viewはselectコマンドのようなものです。たとえば、次のような where ステートメントで、この select にパラメーターを追加することもできます。
WHERE (exam_id = @var)
入力パラメーターを使用してストアド プロシージャを記述し、そのストアド プロシージャを使用してビューから結果セットを取得できます。以下の例を参照してください。
ストアドプロシージャは
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%')
いいえ、ビューは静的です。(SQl サーバーのバージョンに応じて) できることの 1 つは、ビューのインデックス作成です。
あなたの例 (1 つのテーブルのみをクエリする) では、インデックス付きのビューには、インデックスを使用してテーブルをクエリするだけの利点はありませんが、結合条件を使用してテーブルで多くの結合を実行している場合、インデックス付きのビューはパフォーマンスを大幅に向上させることができます。
いいえ、ビュー内のプロシージャにパラメータを渡すことはできません
ビューを実行するためだけにバイパスすることができます.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