在SQL Server视图

问题描述:

使用declare我有这样的查询:在SQL Server视图

DECLARE @year_start INT 
DECLARE @year_end INT 

SET @year_start = 2005 
SET @year_end = 2014 

; WITH p_year AS 
(
    SELECT p_year = @year_start 

    UNION ALL 

    SELECT p_year = p_year + 1 
    FROM p_year 
    WHERE p_year < @year_end 
), 
Interval AS 
(--- 
), 
CTE AS 
(--- 
), 
CTE_1 AS 
(--- 
) 
SELECT something 
FROM CTE_1 
WHERE Rank <= 3 
ORDER BY something 

我试图用它创建表值函数,但无法获取如何在表值函数声明的变量操作。

而我试图创建表值函数为:

CREATE FUNCTION P_Count() 
RETURNS TABLE 
AS 
DECLARE ... 
... 

我希望把它的视图,但Declare声明没有让我。我怎样才能让它成为一个观点?

+5

的视图不能有参数,仅此而已。你必须创建别的东西,比如表值函数。如果您在创建表值函数时遇到问题,请发布相关代码和您得到的错误。 – Paolo

+0

@Paolo我已经给出了表值函数的试用查询 – maliks

+0

想想什么是一个视图。它是数据库中的静态虚拟表。根据定义,参数不能存在,因为那会是别的。 –

您创建功能脚本错过了BEGIN

CREATE FUNCTION P_Count() 
RETURNS @tableName TABLE (structure here) 
AS 
BEGIN 
    DECLARE... 
    ... 
    RETURN; 
END; 

这里是msdn

Maliks语法参考,我想,有些人与你的SQL混淆。现在并不是很明显,您使用递归CTE来生成一个范围内的年份。 There are lots of awesome ways生成一个整数序列(或数字,一般来说),可以与CTE结合来模拟视图中的变量。如果数字的生成方式太频繁,可以考虑为它们建立一个单独的(和索引的)表格。

这是我认为你在找的东西。我忽略了CTE,rank和你没有在你的问题中定义的分组。你可以修改它,你想:

WITH params AS (SELECT BegYr = 2005, EndYr=2014), 
nums AS (SELECT DISTINCT n = number FROM master..spt_values WHERE number>=0) 
SELECT Yr=BegYr + n FROM nums, params 
WHERE n <= EndYr - BegYr 

更一般地,这里是一个使用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