是否可以从存储过程结果创建“永久”表

时间:2012-03-23 19:00:34

标签: sql sql-server-2005 procedure

我对SQL很新。但是真的想尽可能多地学习。但是,我真的有一些工作需要做的事情(有点被抛入其中)。但我一直遇到路障。我需要创建一个始终具有我创建的存储过程的更新信息的表。我最初尝试加入表等,但是无法获得我需要的确切数据。到目前为止,我发现至少要收集正确数据的最佳方法是使用此存储过程。然而,这是另一个路障;把它放在一张桌子里。我需要一个表的原因是因为外部应用程序(正在为我们的位置开发的应用程序)需要使用此表来查看某些信息。由于数据可能会发生变化,因此每天会多次查看此表。我将非常感谢任何帮助或建议可能导致我得到我需要的解决方案。先感谢您。

这是我现在的存储过程。 (我很想能够用这个来创建一个视图但当然我不能因为变量声明而来)

    DECLARE @now DATETIME
    SET @now = CONVERT(VARCHAR(8),GETDATE(),108)


    IF @now BETWEEN '06:40:00' AND '14:39:59'
    SELECT t.ProductionDate, t.Shift, t.LineNumber, t.Cart, t.CavityPosition,   t.ProgramNumber, t.PartNumber,t.Cavity
    FROM tblTransactionDetail t
    JOIN tblLPCurrentOnline c
    on t.Cart=c.Fixture
    AND t.ProgramNumber=c.Program
    AND t.LineNumber=c.Linenumber  
    WHERE Shift = 1 and PartNumber <>''

    ELSE IF @now BETWEEN '14:40:00' AND '22:39:59'
        SELECT t.ProductionDate, t.Shift, t.LineNumber, t.Cart, t.CavityPosition, t.ProgramNumber, t.PartNumber,t.Cavity
    FROM tblTransactionDetail t
    JOIN tblLPCurrentOnline c
    on t.Cart=c.Fixture
    AND t.ProgramNumber=c.Program
    AND t.LineNumber=c.Linenumber 
    WHERE Shift = 2 AND PartNumber <>''

ELSE IF @now BETWEEN '22:40:00' AND '24:59:59' OR @now BETWEEN '00:00:00' AND '06:39:59'
    SELECT  t.ProductionDate, t.Shift, t.LineNumber, t.Cart, t.CavityPosition, t.ProgramNumber, t.PartNumber,t.Cavity
 FROM tblTransactionDetail t
JOIN tblLPCurrentOnline c
on t.Cart=c.Fixture
AND t.ProgramNumber=c.Program
AND t.LineNumber=c.Linenumber 
WHERE Shift = 3 AND PartNumber <>'' 

3 个答案:

答案 0 :(得分:0)

您可以通过在“FROM”子句之前说“INTO whereever”来创建包含任何选择结果的表。但如果表存在,您将收到错误。因此,通常您会检查存储过程以查看表是否存在,如果存在则删除(删除),然后运行查询。然后,如果您希望所获得的数据或多或少“活跃”,则必须在查询之前安排存储过程运行

详细信息取决于您使用的产品,您编写的所有内容看起来像我与microsoft sql server关联的函数名称/约定,或者可能是mysql,但请说出您正在使用的内容。

另外:欢迎使用StackOverflow,您应该使用您正在使用的精确版本的sql来标记您的问题;读这个,很简短:https://stackoverflow.com/tags/sql/info

答案 1 :(得分:0)

我认为你不需要参数。我没有写过这样的查询,但你可以说“DATEPART(hh,GETDATE())”和“DATEPART(mm,GETDATE())”分别得到小时和分钟。您可以在查询中包含测试时间。

您可以使用它来删除if语句和参数。现在你有:

   WHERE Shift = 3 AND PartNumber <>'' 

从概念上讲,如果你可以说“WHERE shift = 现在的任何转移”,那就可以了。在SQL中,您使用CASE语句。有两种形式;你可以在google上看到这个,我将在下面显示“搜索”表单。

如果只是两个班次说,从午夜到下午2点,是1,其他时间是班次2,你想知道是否小时&lt; 14或不。你可以说:

  WHERE shift = CASE WHEN DATEPART(hh, GETDATE()) < 14 THEN 1 ELSE 2 END AND partNubmer <> ''

这有意义吗?根据它的运行时间,你要么得到shift = 1 OR shift = 2.

SELECT t.ProductionDate, t.Shift, t.LineNumber, t.Cart, t.CavityPosition,        t.ProgramNumber, t.PartNumber,t.Cavity
    FROM tblTransactionDetail t
    JOIN tblLPCurrentOnline c
    on t.Cart=c.Fixture
    AND t.ProgramNumber=c.Program
    AND t.LineNumber=c.Linenumber  
    WHERE PartNumber <>'' AND
       CASE WHEN EXPRESSION_THAT_RETURNS_TRUE_DURING_SHIFT_1 THEN 1 
       EXPRESSION_THAT_RETURNS_TRUE_DURING_SHIFT_2 THEN 2
       ELSE 3 END

在这里,它似乎是一种方便的方法,可以找出它是什么样的转变:“当前时间的小时部分是从现在开始的20分钟?”在sql server中,要获得该数字,请说:

      SELECT DATEPART( hh, DATEADD(mi, 20, GETDATE()))

所以,你的表达可以是

    WHERE PartNumber <>'' AND
       CASE WHEN DATEPART( hh, DATEADD(mi, 20, GETDATE())) BETWEEN 7 AND 15 THEN 1 
       WHEN DATEPART( hh, DATEADD(mi, 20, GETDATE())) BETWEEN 16 AND 22 THEN 2 -- 4pm to 11:59:59...
       ELSE 3 END

希望它有效。您可以尝试将datepart设为秒而不是几小时,ss是用于秒的符号。

答案 2 :(得分:0)

我看不出是否需要创建存储过程,除非有大量数据并且生成数据需要一段时间。

我建议稍微将存储过程更改为视图,然后视图将被视为表。

我没有测试过查询,所以如果有任何错误我道歉:

CREATE VIEW REQUIREDTABLENAME
AS
    SELECT t.ProductionDate, t.Shift, t.LineNumber, t.Cart, t.CavityPosition,   t.ProgramNumber, t.PartNumber,t.Cavity  
    FROM tblTransactionDetail t  
    JOIN tblLPCurrentOnline c  
    on t.Cart=c.Fixture  
    AND t.ProgramNumber=c.Program  
    AND t.LineNumber=c.Linenumber    
    WHERE Shift = 
    case 
    when CONVERT(VARCHAR(8),GETDATE(),108)  BETWEEN '06:40:00' AND '14:39:59' then 1 
    when CONVERT(VARCHAR(8),GETDATE(),108)  BETWEEN '14:40:00' AND '22:39:59' then 2 
    when CONVERT(VARCHAR(8),GETDATE(),108)  BETWEEN '22:40:00' AND '24:59:59' OR CONVERT(VARCHAR(8),GETDATE(),108)  BETWEEN '00:00:00' AND '06:39:59' then 3 
    end 
    and PartNumber <>''