我们能否在Microsoft SQL Server中向视图传递参数?
我尝试以以下方式创建视图,但它不起作用:
create or replace view v_emp(eno number) as select * from emp where emp_id=&eno;
我们能否在Microsoft SQL Server中向视图传递参数?
我尝试以以下方式创建视图,但它不起作用:
create or replace view v_emp(eno number) as select * from emp where emp_id=&eno;
一个视图只是一个预定义的“SELECT”语句。所以唯一真正的答案就是:不能。
我认为你真正想做的是创建一个存储过程,在原则上,您可以使用任何有效的SQL来执行您想要的任何操作,包括接受参数和选择数据。
但是看起来您只需要在从视图中选择时添加一个where子句,但您没有提供足够的细节来确定。
如果您不想使用一个函数,可以使用类似以下的方法
-- 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 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)
您的参数将被保存并在配置表中进行更改。
不,你可以将参数传递给视图中的过程。
以下是一种我目前还未见过的选项:
只需将您想要限制的列添加到视图中:
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 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
您可以绕过保存,仅运行视图。 SQL会哭泣,但只需这样做并运行即可!
create or replace view v_emp(eno number) as select * from emp where (emp_id = @Parameter1);