在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
声明没有让我。我怎样才能让它成为一个观点?
答
您创建功能脚本错过了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
的视图不能有参数,仅此而已。你必须创建别的东西,比如表值函数。如果您在创建表值函数时遇到问题,请发布相关代码和您得到的错误。 – Paolo
@Paolo我已经给出了表值函数的试用查询 – maliks
想想什么是一个视图。它是数据库中的静态虚拟表。根据定义,参数不能存在,因为那会是别的。 –