【问题标题】:Pass dynamic view name and condition传递动态视图名称和条件
【发布时间】:2020-10-28 12:11:09
【问题描述】:

我想通过动态传递视图名称和 where 条件在视图中显示数据。

为此,我创建了一个函数,我想在其中动态使用视图和条件。

我已尝试完成此操作,但没有成功。

查看几个视图名称示例 - sch.view1、sch.view2、sch.view3

Create function dbo.getviewdata
   (@viewname nvarchar(128), @wherecondition nvarchar(128))
return table
as
return
   select * from sys.partitions where object_id = object_id(@viewname)

我也想为同一个视图添加 where 条件。

请告诉我怎么做?

选择函数的原因,在PROD中,我只能使用select statement运行函数。我无法在 prod 中运行 procedure

【问题讨论】:

  • 唯一的办法就是使用动态SQL,而且只能在存储过程中使用动态SQL,不能在函数中使用。
  • 问题是我无法在 PROD 中执行存储过程。有没有关于解决方案的回合?
  • 不...虽然在我看来,通常调用带有动态 where 子句的视图是使用 SQL 的完全错误的方式。应该使用特定 where 子句查询特定视图,以了解正在使用的情况。通用 SQL 并不是它的真正用途,也不是我鼓励的设计模式。
  • @DaleK,我同意存储过程,但我认为在 Dinesh 的情况下,他不能调用 SP,但他可以通过 select * from openrowset... 调用它,对吗?我认为这将是最适合他的答案...
  • 现在是时候开始向队友、前辈、老板询问方向了。你问的是不可能的,这个方向似乎要大得多XY problem。开发人员永远不应该访问生产数据库 - 所以您的组织可能需要找到一种方法来在不同的环境中提供对生产数据库的访问权限?

标签: sql-server tsql sql-server-2012


【解决方案1】:
  declare @view varchar(100)='xyz'
  declare @whre varchar(max)=''
  if(len(@whre)=0 or @whre is null)
  exec('create view '+@view+' as select * from sys.partitions')
  else
  exec('create view '+@view+' as select * from sys.partitions where '+@whre)
  exec('select top 10 * from '+ @view)

【讨论】:

  • 相当肯定 OP 不想创建视图......这肯定不能在函数中完成。
猜你喜欢
  • 2015-09-10
  • 1970-01-01
  • 2021-06-19
  • 1970-01-01
  • 2013-10-08
  • 2021-01-09
  • 2013-09-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多