【问题标题】:INSERT multiple data from a SINGLE SELECT Statement (SQL)从 SINGLE SELECT 语句 (SQL) 插入多个数据
【发布时间】:2013-11-08 15:06:16
【问题描述】:

我正在尝试从 SQL Server 2008 中的单个选择语句中插入多个数据。

(1) 对于 Select 语句:

CREATE PROCEDURE getAllDaysBetweenTwoDate
(
@StartDate DATETIME,    
@EndDate DATETIME
)
AS
BEGIN

DECLARE @TOTALCount INT
SET @StartDate = DATEADD(DAY,-1,@StartDate)
Select  @TOTALCount= DATEDIFF(DD,@StartDate,@EndDate);

WITH d AS 
        (
          SELECT top (@TOTALCount) AllDays = DATEADD(DAY, ROW_NUMBER() 
            OVER (ORDER BY object_id), REPLACE(@StartDate,'-',''))
          FROM sys.all_objects
        )
    SELECT AllDays From d
RETURN 
END
GO

-- 使用此代码,我可以获取两个日期之间的日期,即 StartDate 和 EndDate。

(2) 我正在尝试将日期插入另一个表。

举例

@StartDate = 2013-11-05
@EndDate = 2013-11-08

结果将是 ff:

2013-11-05,
2013-11-06,
2013-11-07,
2013-11-08

我想将这些日期插入到另一个表中。

我该怎么做?请帮帮我。

谢谢!

【问题讨论】:

  • insert into table1 从 table2 中选择内容
  • @Randy 你说得对,但我觉得这不是他真正想要的。
  • 我已经试过了。它没有用。如您所见,SELECT 语句中会有很多数据,因为 SELECT 语句正在获取两个日期之间的日期。它不插入
  • @RaduGheorghiu 是的,我已经试过了。但它没有用。我只想将我的 select 语句的结果插入到另一个表中。你知道怎么做吗?请帮帮我。
  • @user2612969,您能否发布您尝试插入数据的代码,如果您使用正确的语法,插入语句可以处理多行。

标签: sql sql-server date


【解决方案1】:

试试:

INSERT INTO MyTable 
EXECUTE getAllDaysBetweenTwoDate @StartDate = '2013-11-05', @EndDate = '2013-11-08';

编辑:(插入“1”常量)

DECLARE @t table ([date] datetime)

INSERT INTO @t ([date])
EXECUTE getAllDaysBetweenTwoDate @StartDate = '2013-11-05', @EndDate = '2013-11-08';

INSERT INTO MyTable (DateColumn, Number1Column)
SELECT [date], '1' FROM @t 

【讨论】:

  • 我会试试这个。谢谢@@wdosanjos
  • 嗨。我试过这个......但它没有用。它说'Msg 156,Level 15,State 1,Line 2 关键字'EXECUTE'附近的语法不正确'
  • 嗨!这已经奏效了。它在另一个表中插入了日期(在开始和结束之间),但我也想在日期中插入“1”。任何的想法?谢谢!
【解决方案2】:

根据您的 cmets,您正尝试插入常量值和日期。更改您的代码以执行此操作

CREATE PROCEDURE getAllDaysBetweenTwoDate
(
@StartDate DATETIME,    
@EndDate DATETIME
)
AS
BEGIN

DECLARE @TOTALCount INT
SET @StartDate = DATEADD(DAY,-1,@StartDate)
Select  @TOTALCount= DATEDIFF(DD,@StartDate,@EndDate);

WITH d AS 
        (
          SELECT top (@TOTALCount) AllDays = DATEADD(DAY, ROW_NUMBER() 
            OVER (ORDER BY object_id), REPLACE(@StartDate,'-',''))
          FROM sys.all_objects
        )
    SELECT AllDays, 1 As Leave From d
RETURN 
END

GO

然后这样做

INSERT INTO tblAttendance2 (DateTimeIn, Leave) 
EXEC getAllDaysBetweenTwoDate 
   @StartDate = '2013-11-05', 
   @EndDate = '2013-11-08';

如果你想返回用户 ID,试试这个

CREATE PROCEDURE getAllDaysBetweenTwoDate
(
@StartDate DATETIME,    
@EndDate DATETIME,
@userid varchar(100)
)
AS
BEGIN

DECLARE @TOTALCount INT
SET @StartDate = DATEADD(DAY,-1,@StartDate)
Select  @TOTALCount= DATEDIFF(DD,@StartDate,@EndDate);

WITH d AS 
        (
          SELECT top (@TOTALCount) AllDays = DATEADD(DAY, ROW_NUMBER() 
            OVER (ORDER BY object_id), REPLACE(@StartDate,'-',''))
          FROM sys.all_objects
        )
    SELECT AllDays, 1 As Leave, @userid As userId From d
RETURN 
END

GO

然后这样做

INSERT INTO tblAttendance2 (DateTimeIn, Leave, UserId) 
EXEC getAllDaysBetweenTwoDate 
   @StartDate = '2013-11-05', 
   @EndDate = '2013-11-08',
   @UserId = 'xyz';

【讨论】:

  • 附加问题,如果我想将用户 ID 连同它一起插入到 tblAttendance2 中怎么办?我将如何做? @rs.
  • @user2612969,您可以添加用户 ID 作为参数并在您的选择语句中返回,查看我更新的答案
  • 嗨!这在 SQL 中有效,但在 Visual Studio 中无效。你能再帮我一次吗?谢谢@rs。 :(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-25
  • 1970-01-01
  • 2022-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多