在SQL Server视图中使用Declare

时间:2016-07-25 14:18:54

标签: sql-server view declare

我有这样的查询:

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声明不允许我。我怎样才能看到它?

2 个答案:

答案 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