簡體   English   中英

SQL Server 2012使用臨時表的存儲過程

[英]SQL Server 2012 using temp table of stored procedure

首先,感謝您的閱讀。 我有一種無法解決的情況。

我創建了一個存儲過程,該存儲過程創建了一個臨時表,其中包含兩個日期之間的日期。

示例:如果我將'2015-07-20''2015-07-25'作為參數傳遞給存儲過程,它將創建一個表,該表從2015年7月20日到25日共5天。

我需要做的是在聯接情況下使用此臨時表,類似於此查詢。

 SELECT * 
 FROM control
 INNER JOIN
     (my table returned from sp  => exec calendario_dias ... ) ON dia = cta_dia

這是存儲過程代碼:

SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[calendario_dias]
        (@fecha_ini date,
        @fecha_fin date)
AS
BEGIN
    IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID('#dias_calendar') AND type in (N'U'))
       DROP TABLE [dbo].#dias_calendar

    CREATE TABLE #dias_calendar(dia date)   

    WHILE @fecha_ini <= @fecha_fin
    BEGIN
        INSERT INTO #dias_calendar (dia) 
           SELECT @fecha_ini

        SET @fecha_ini = CONVERT(date, dateadd(day, 1, @fecha_ini))
    END 

    SELECT dia 
    FROM #dias_calendar
END

這是帶有Tally-Table函數的方法(您可以在任何地方使用此方法...)

編輯:現在使用自己的功能。 您可以隨時隨地使用和加入此功能...

CREATE FUNCTION [dbo].[GetRunningNumbers](@anzahl INT=10000000, @StartAt INT=0)
RETURNS TABLE
AS 
RETURN
WITH E1(N) AS( -- 10 ^ 1 = 10 rows
    SELECT 1 FROM(VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))t(N)
),
E2(N) AS(SELECT 1 FROM E1 a CROSS JOIN E1 b), -- 10 ^ 2 = 100 rows
E4(N) AS(SELECT 1 FROM E2 a CROSS JOIN E2 b), -- 10 ^ 4 = 10,000 rows
E8(N) AS(SELECT 1 FROM E4 a CROSS JOIN E4 b), -- 10 ^ 8 = 10,000,000 rows
CteTally AS(
    SELECT TOP(ISNULL(@anzahl,1000000)) ROW_NUMBER() OVER(ORDER BY(SELECT NULL)) -1 + ISNULL(@StartAt,0) As Nmbr
    FROM E8
)
SELECT * FROM CteTally;
GO

CREATE FUNCTION dbo.DateLine
(
     @d1 DATETIME
    ,@d2 DATETIME
)
RETURNS TABLE
AS
RETURN
SELECT DATEADD(DAY,runningNumbers.Nmbr,@d1) AS DateRunning
FROM dbo.GetRunningNumbers(ABS(DATEDIFF(DAY,@d1,@d2))+1,0) AS runningNumbers

GO

--Always three dates with one obejct...
SELECT  name,object_id,DateRunning
FROM sys.objects 
CROSS APPLY dbo.DateLine({ts'2015-07-01 00:00:00'},{ts'2015-07-03 00:00:00'}) AS dl
ORDER BY object_id,DateRunning
GO

DROP FUNCTION dbo.DateLine;
DROP FUNCTION dbo.GetRunningNumbers;
GO

臨時表是您連接的本地 ,不再使用時會被刪除,它們的工作方式與常規表相同。

嘗試:

CREATE TABLE test1(
    [Id] [bigint] IDENTITY(1,1) NOT NULL,
    [Column1] [int] NULL,
    [Column2] [int] NULL
) ON [PRIMARY]


insert into test1(column1,column2) values(1,2),(3,4),(5,6),(7,8)

和加入:

create table #tbl1(Id bigint Identity,value1 varchar(max))

insert into #tbl1(value1) values('a'),('b'),('c'),('d')

select * from test1 join #tbl1 on test1.Id=#tbl1.Id

小提琴演示

明確的答案

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION calendario_dias
(
-- Add the parameters for the function here
@fecha_ini date, 
@fecha_fin date

)
RETURNS
@dias_calendar TABLE
(
-- Add the column definitions for the TABLE variable here
dia date
)
AS
BEGIN
-- Fill the table variable with the rows for your result set

WHILE @fecha_ini <= @fecha_fin
BEGIN
INSERT INTO @dias_calendar
SELECT @fecha_ini
SET @fecha_ini = CONVERT(date, dateadd(day, 1, @fecha_ini))
END

RETURN
END
GO

接着 :

SELECT *
FROM control
INNER JOIN
[dbo].[calendario_dias](@fecha_ini date,@fecha_fin date)
ON dia = cta_dia

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM