SQL视图 – 没有variables?

是否有可能在视图中声明一个variables? 例如:

Declare @SomeVar varchar(8) = 'something' 

给我的语法错误:

关键字'Declare'附近的语法不正确。

你是对的。 VIEW中不允许局部variables。

你可以在一个表值函数中设置一个局部variables,它返回一个结果集(就像一个视图一样)。

http://msdn.microsoft.com/en-us/library/ms191165.aspx

例如

 CREATE FUNCTION dbo.udf_foo() RETURNS @ret TABLE (col INT) AS BEGIN DECLARE @myvar INT; SELECT @myvar = 1; INSERT INTO @ret SELECT @myvar; RETURN; END; GO SELECT * FROM dbo.udf_foo(); GO 

你可以使用WITH来定义你的expression式。 然后做一个简单的Sub-SELECT来访问这些定义。

 CREATE VIEW MyView AS WITH MyVars (SomeVar, Var2) AS ( SELECT 'something' AS 'SomeVar', 123 AS 'Var2' ) SELECT * FROM MyTable WHERE x = (SELECT SomeVar FROM MyVars) 

编辑:我试图使用CTE在我以前的答案是不正确的,如@bummi指出。 这个选项应该改为:

这里有一个使用CROSS APPLY的选项,来解决这个问题:

 SELECT st.Value, Constants.CONSTANT_ONE, Constants.CONSTANT_TWO FROM SomeTable st CROSS APPLY ( SELECT 'Value1' AS CONSTANT_ONE, 'Value2' AS CONSTANT_TWO ) Constants 

是的,这是正确的,你不能在视图中有variables(还有其他的限制)。

视图可用于结果可以用select语句replace的情况。

我所做的是创build一个与表variables相同的视图,并将该视图链接到第二个视图。 所以一个视图可以从另一个视图中select。 这达到了相同的结果

使用spencer7593提到的函数是dynamic数据的正确方法。 对于静态数据,与SQL数据devise(与sprocs中写入大量过程代码的反模式)相一致的更高性能的方法是使用静态值创build单独的表并join到它中。 从性能的angular度来看,这是非常有益的,因为SQL引擎可以围绕JOIN构build有效的执行计划,并且如果需要,还可以添加索引。

使用函数(或任何内联计算值)的缺点是对每个返回的潜在行都会发出标注,这是非常昂贵的。 为什么? 由于SQL必须首先使用计算的值创build完整的数据集,然后将WHERE子句应用于该数据集。

十次中有九次你不需要在查询中dynamic计算单元格值。 它更好地弄清楚你将需要什么,然后devise一个支持它的数据模型,并用半dynamic数据填充数据模型(例如通过批处理作业),并使用SQL引擎通过标准的SQL来完成繁重的工作。