sql - 日期生成器到表变量
问题描述
我读到了一种生成日期范围的方法:Generate a set or sequence without loops。我在应用该方法时遇到问题。
此代码成功生成了一个日期表,从@Start
到@End
:
;WITH d([Date]) AS (
SELECT DATEADD(DAY, n-1, @Start)
FROM (
SELECT TOP (DATEDIFF(DAY, @Start, @End) + 1)
ROW_NUMBER() OVER (ORDER BY Number) FROM master..spt_values
) AS x(n)
)
SELECT d.Date
FROM d
我对更高级的 SQL 还很陌生,所以这完全是一个黑匣子。但它有效。所以现在我想将结果保存到表变量中以供进一步处理:
DECLARE @Days TABLE ([Date] DATE NULL, Val INT NULL)
日期将有一个与之关联的值。然而,简单地插入表格似乎不起作用。以下内容或将其包装在另一个 select 语句中均无效:
INSERT INTO @Days (Date)
WITH d([Date]) AS (
SELECT DATEADD(DAY, n-1, @Start)
FROM (
SELECT TOP (DATEDIFF(DAY, @Start, @End) + 1)
ROW_NUMBER() OVER (ORDER BY Number) FROM master..spt_values
) AS x(n)
)
SELECT d.Date
FROM d
似乎“最后一条语句必须以分号结尾”或“附近的语法不正确;” 根据分号的存在抛出。
你有什么方向吗?我像疯了一样困惑。
解决方案
您的问题不是 CTE,而是INSERT
语法。如文档中所述,CTE 位于INSERT
:
WITH d([Date]) AS (
SELECT DATEADD(DAY, n-1, @Start)
FROM (
SELECT TOP (DATEDIFF(DAY, @Start, @End) + 1)
ROW_NUMBER() OVER (ORDER BY Number) FROM master..spt_values
) AS x(n)
)
INSERT INTO @Days (Date)
SELECT d.Date
FROM d;
推荐阅读
- jira - JIRA:CURL 命令的 Rest API 身份验证
- javascript - 在 node.js 中实现嵌套异步调用
- mono - Ubuntu 16.4:monodoc 不起作用(缺少 libgluezilla)
- math - 8T(n/2) +n^2 的树方法
- vb.net - 从 Google Drive 读取字节时出现 FileNotFoundException
- c# - 为什么我的代码在代码中使用 MessageBox.Show() 工作而没有它就无法工作?
- mysql - 从数据库.net core 2中选择特定行
- c++ - SFML UdpSockets 没有发送/接收没有错误?
- r - 在 R 中是否使用引号分配 NA
- mysql - 错误:命令 '/bin/sh 返回一个非零代码:1