【问题标题】:SQL unable to alter view having DECLARE statementSQL 无法更改具有 DECLARE 语句的视图
【发布时间】:2017-02-21 11:36:09
【问题描述】:

我正在尝试改变下面的视图:

ALTER VIEW [dbo].[Win.v_TodayMin365]
AS

    declare @tblOut table(Dates Date)
    declare @cnt INT = -365
    while @cnt < 0
    Begin
            set @cnt = @cnt + 1;
            insert into @tblOut (Dates) values(cast(dateadd(day,@cnt,getdate()) as Date))
    END
    select * from @tblOut
    deallocate @tblOut
    deallocate @cnt
GO

这样的代码可以工作(如果我突出显示 AS 和 GO 之间的所有内容并点击执行,我会得到预期的输出),但我无法将其作为 ALTER VIEW 运行。然后,我收到以下错误:

关键字“declare”附近的语法不正确。 期望 '('、SELECT 或 WITH

提前感谢您的任何想法!

【问题讨论】:

标签: sql-server


【解决方案1】:

您不能在View 中使用Declare 变量

实际上你不需要为此使用While 循环。使用计数表技巧生成日期比 while 循环方法更有效

ALTER VIEW [dbo].[Win.v_TodayMin365]
AS
  WITH E1(N)
       AS (SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
           SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
           SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
           SELECT 1), --10E+1 or 10 rows
       E2(N)
       AS (SELECT 1 FROM E1 a,E1 b), --10E+2 or 100 rows
       E4(N)
       AS (SELECT 1 FROM E2 a,E2 b), --10E+4 or 10,000 rows max
       calendar
       AS (SELECT Dateadd(dd, Row_number()OVER(ORDER BY n), Dateadd(yy, -1, Cast(Getdate() + 1 AS DATE))) AS dates
           FROM   E4 l)
  SELECT *
  FROM   calendar
  WHERE  dates <= Cast(Getdate() AS DATE) 

这甚至可以转换为Table valued functionStored Procedure

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多