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

Tsql 视图中包含变量的动态SQL(SQL Server),tsql,sql-server-2008,variables,views,dynamic-sql,Tsql,Sql Server 2008,Variables,Views,Dynamic Sql,您好,我正在尝试在SQL Server 2008的新视图窗口中执行此操作: declare@var=从数据库中选择数据库; exec'从'+@var'+.dbo.Names'中选择名称 这个视图实际上在SQL Server中运行,但我无法保存它。这给了我一个错误,我可能只是创建一个表返回函数,在其中执行所有相同的操作,然后返回表,并创建一个基本上从该表获取所有内容的视图,但我不确定这样做可能会导致性能下降。如有任何建议,将不胜感激!谢谢 解决方案: 我只是让它删除旧视图,然后在存储过程中使用动态

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

declare@var=从数据库中选择数据库; exec'从'+@var'+.dbo.Names'中选择名称

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

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

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

您可以使用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
也通过加入

也可通过交叉申请


这在视图中是无效的,而且您也不能在UDF中使用动态SQL。呸!那么有没有办法得到这些结果呢?我只是觉得奇怪,我可以在SQL Server 2008中作为我的视图运行,它运行良好,但不允许我保存。SSMS中的视图设计器只是标准的图形查询设计器,因此您可以键入各种任意SQL并执行它,但这并不意味着它对视图有效!哦,我从来没有意识到,哈哈,我以为它实际上是一个sql视图调试器。它不一定正确,但我正计划检查它,多亏了Martin,这也是一个很大的帮助:但它不是一个参数,它是要使用的数据库的名称。根据我所知,这需要作为一个整体来完成exec@string因为没有其他方法来定义对象,所以自定义项不起作用。它在函数中的“执行字符串”中使用了无效的副作用运算符或时间相关运算符。是的,我刚刚试过,我想知道我是否可以创建一个存储过程,用新的数据集重新创建视图?根据您将如何使用结果集,存储过程可以返回结果。但它不能像表值函数那样被其他视图或子查询引用。对不起,我对这种类型的论坛不熟悉。在我更好地理解了最初的问题之后,我试图编辑我的帖子。我没有意识到要查询的表是参数之一。
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
WITH params AS ( SELECT varType='%Admin%', varMinStatus=1)
SELECT status, name 
    FROM sys.sysusers CROSS APPLY params
    WHERE status > varMinStatus OR name LIKE varType