[英]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.