【问题标题】:Stored proc temporary table with parameters带有参数的存储过程临时表
【发布时间】:2017-03-06 13:59:23
【问题描述】:

您好,在存储过程中,我创建了一个临时表,其中填充了一个选择,它执行一个函数以返回日期重复。

我的临时表的创建如下所示:

    BEGIN
        insert into #tmp_recu
        SELECT * FROM dbo.CrontabSchedule('0 0 * * *', '2017-2-1', '2017-2-28')
    END

创建此临时表后,我使用此临时表执行查询,如下所示:

Select * from mission
Cross Join #temp_recu

问题是我想用任务表中的字段(名为重复的字段)替换我的临时表创建中的“0 0 * * *”,那么我该怎么做呢?

谢谢!

编辑

实际上,在我的查询中,我想调用函数“CrontabSchedule”并将“任务”表中的一个字段放入参数中,如下所示:

select * from mission m
cross join select * from dbo.CronTabSchedule(mission.reccurence,'2017-1-1','2017-1-31') 

当我像这样调用函数时它起作用了

select * from dbo.CronTabSchedule('0 0 * * *','2017-1-1','2017-1-31') 

但是当我将 '0 0 * * *' 替换为 'Mission.recurrence' (其中包含每个任务的重复模式)时,我有一个错误:

无法绑定多部分标识符“Mission.recurrence”。

Crontab调度代码:

SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO
ALTER FUNCTION [dbo].[CrontabSchedule](@Expression [nvarchar](100), @Start[datetime], @End [datetime])
RETURNS  TABLE (
[Occurrence] [datetime] NULL
) WITH EXECUTE AS CALLER
AS 
EXTERNAL NAME [NCrontabSQL].[NContab.SQL.SqlCrontab].[GetOccurrences]

该函数返回一个表,其中有一列名为“Occurence”,并包含一个日期列表。

【问题讨论】:

  • 只是不要select * 并且只选择您想要的字段?还是我错过了什么?
  • 您在寻找表值函数吗?
  • 查看参考链接以了解如何提出完美问题:spaghettidba.com/2015/04/24/…
  • 这取决于dbo.CrontabSchedule 的工作方式以及您如何定义#tmp_recu。你能告诉我们他们两个吗?一个可能的解决方案是编辑dbo.CrontabSchedule 以首先返回您的值,我们可以更改函数定义还是您想要单独的查询?
  • 我已经编辑了更多信息

标签: sql sql-server stored-procedures temp-tables


【解决方案1】:

这里的问题很模糊,但我假设 CronTabSchedule 必须是表值函数(希望是内联版本,但这是另一个主题)。如果我是正确的,您可以很容易地使用 CROSS APPLY。

select * 
from mission m
cross apply dbo.CronTabSchedule(m.reccurence,'2017-1-1','2017-1-31') cts

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-23
    • 2014-02-18
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 2013-11-02
    相关资源
    最近更新 更多