在视图中包含变量的动态 SQL (SQL Server)

Posted

技术标签:

【中文标题】在视图中包含变量的动态 SQL (SQL Server)【英文标题】:Dynamic SQL with variables inside a view (SQL Server) 【发布时间】:2011-05-10 21:57:52 【问题描述】:

您好,我实际上是在尝试在 SQL Server 2008 的新视图窗口中执行此操作:

声明@var =(从数据库中选择数据库); exec ('从'中选择名称' + @var ' + .dbo.Names);

这个视图实际上在 SQL Server 中运行,但我无法保存它(它给了我一个错误),我可能只是创建一个表返回函数,在其中执行所有相同的操作并返回表并创建一个视图基本上从该表中获取所有内容,但我不确定这样做可能会导致性能下降。任何建议将不胜感激!谢谢。

解决方案: 我刚刚结束了它删除旧视图并在存储过程中重新创建一个新视图(使用动态 sql)。当该值更改时,我将调用 SP,它将更新视图以指向正确的数据库。感谢所有帮助家伙,知道什么不能做阻止了我尝试这些方法。

【问题讨论】:

这在视图中无效,并且 AFAIK 您也不能在 UDF 中使用动态 SQL。 呸!那么有没有办法得到这些结果呢?我只是觉得奇怪的是,我可以在 SQL Server 2008 中完全运行它作为我的视图,它运行良好,但它不会让我保存。 SSMS 中的视图设计器只是标准的图形查询设计器,因此您可以输入各种任意 SQL 并执行它,但这并不意味着它对视图有效! 哦我从来没有意识到哈哈我以为它实际上是一个sql视图调试器。 不一定正确,但我正计划检查它,感谢 Martin,这也给了我很大的帮助 :) 【参考方案1】:

视图不能接受参数。表值函数是解决方案。但是您至少必须知道另一端将出现的表和结果集。如果您将要查询的表作为参数传递,您如何知道结果数据集的结构?

【讨论】:

但它不是参数,它是要使用的数据库的名称。据我所知,这需要作为 exec(@string) 来完成,因为没有其他方法可以定义对象。 UDF 不起作用。它给出了错误“在函数内的'EXECUTE STRING'中无效使用副作用或时间相关的运算符。” 是的,刚刚试过,我想知道我是否可以创建一个存储过程,用新的数据集重新创建视图? 根据您打算如何使用结果集,存储过程可以返回结果。但它不能被其他视图或子查询等引用,就像表值函数一样。 对不起,我是这种论坛的新手。在我更好地理解原始问题后,我尝试编辑我的帖子。我没有意识到要查询的表是参数之一。【参考方案2】:

您可以使用 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 (SQL Server)的主要内容,如果未能解决你的问题,请参考以下文章

当变量包含单引号时 SQL 动态查询字符串中断

oracle动态查询通过sql获取游标变量

oracle笔记-动态SQL

mysql视图,存储过程,函数,事务,触发器,以及动态执行sql

Oracle PL/SQL 动态 if 语句全局变量

如何使用 Oracle (PL/SQL) 动态 sql 将数据查询到 %rowtype 变量中