使用参数创建 SQL 视图

Posted

技术标签:

【中文标题】使用参数创建 SQL 视图【英文标题】:Creating a SQL View with parameters 【发布时间】:2012-07-16 12:59:54 【问题描述】:

我有一个接受参数的 SQL 查询。现在,当我尝试将该查询包含到视图中时,我遇到了一个错误,因为视图不能像 SP 或函数那样保存参数。

因此,如果我必须创建必须包含参数的视图,是否有可能?

非常感谢

【问题讨论】:

Views cannot 有参数 - 要么您需要返回所有内容(然后使用从该视图中选择的参数),要么您需要将其转换为表格 -值存储函数 Create parameterized VIEW in SQL Server 2008的可能重复 【参考方案1】:

我不认为你可以在视图中创建一个参数。但是你可以创建一个像下面这样接受输入参数的函数。

CREATE FUNCTION dbo.Sample (@Parameter varchar(10))
RETURNS TABLE
AS
RETURN
(
 SELECT Field1, Field2,....
 FROM YourTable
 WHERE Field3 = @Parameter
)

【讨论】:

一个 ITVF(与 TVF/SF 相对)实际上是一个关于如何合并到最终查询中的视图。【参考方案2】:

不,from MSDN

创建一个定义了内容(列和行)的虚拟表 通过查询。使用此语句在一个或一个中创建数据视图 数据库中的更多表。例如,视图可用于 以下用途:

关注、简化和定制每个用户对 数据库。

作为一种安全机制,允许用户通过 查看,不授予用户直接访问的权限 基础基表。

提供一个向后兼容的接口来模拟一个表 架构已更改。

因此,基本上,这就像一个表格,而您可以向表格添加“参数”的唯一方法是在访问视图时通过过滤器语句

【讨论】:

这是我听过的关于禁止参数化视图最合理的解释。但是,当您需要参数来过滤子查询时,仍然很糟糕。【参考方案3】:

绝对不是。 将 View 视为包含一组已编译数据的表(尽管实际上视图与表不同),因此它永远不会有任何输入参数,如 sp 或函数。

【讨论】:

【参考方案4】:

View不能直接传参数,但是可以使用context_info,例如

declare @v varbinary(8)
set @v = cast(cast(floor( current_timestamp as float)) as bigint) as varbinary) --
set context_info @v -- save 
select * from my_viev

create my_view as
with CTE(date) as (
  select cast(cast(substring(context_info(),1,8) as bigint) as datetime) date  -- read
)
select * from filials p
 left join filials rea on rea.number = p.number 
 and (date between         rea.dateopen and '12.12.9999')
where date between p.datestart and p.datestop 

【讨论】:

【参考方案5】:

你们从来没有这样做过,因为 VIEW 是由查询创建的一个完整的其他表,您可以在该查询中包含参数....它也非常简单

像使用其他参数一样构建您的视图....

例子:

USE [iepa]
GO
/****** Object:  StoredProcedure [dbo].[get_Batch_Data]    Script Date: 06/30/2015 11:41:38 ******/
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[get_Batch_Data]
@inparm varchar(12)
AS
select *
from batch_data
where COM_Batch_ID=@inparm

现在像这样调用那个视图:

select from get_batch_data('61404')  <<<< 61404 is the parameter being passed....

非常简单且非常强大,因为您可以使用视图向表的子集或表的联合提供 UNALTERABLE 信息。 视图不是表格,所以有些事情你有时不能做。

但是当你在查询中形成一个非常复杂的连接/联合时,这些是你不能做的事情......自 1999 年以来一直在使用上面的那个,所以我知道它有效......

【讨论】:

当您居高临下时,您错过了创建存储过程而不是视图这一事实。 谢谢。我搜索了参数化视图,smarta** 说“你弯下腰,使用这个”并编写了一个存储过程。

以上是关于使用参数创建 SQL 视图的主要内容,如果未能解决你的问题,请参考以下文章

sql server创建视图添加where条件,条件包含一个参数

oracle 视图传递参数

从 sql 函数创建 sql 视图

如何在文件中从SQL源创建BigQuery视图(Windows命令行)

sql 创建视图常用的几种sql函数

sql中的视图怎么创建及使用呢!