我有这样的查询:
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
声明不允许我。我怎样才能看到它?
答案 0 :(得分:0)
您的创建功能脚本错过了BEGIN
:
CREATE FUNCTION P_Count()
RETURNS @tableName TABLE (structure here)
AS
BEGIN
DECLARE...
...
RETURN;
END;
这是msdn
的语法参考答案 1 :(得分:0)
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