2012-03-23 65 views
0

我对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 <>'' 

回答

0

你可以这样创建的任何选择的结果的表“FROM”条款之前的“INTO无论哪里”。但是,如果表存在,你会得到一个错误。因此,通常您会检查存储过程以查看表是否存在,如果存在则删除(删除),然后运行查询。然后,如果您希望获得的数据或多或少处于“活动”状态,则必须先安排存储过程运行。

具体取决于您使用的产品,您编写的所有内容看起来像函数名称/约定我与微软的SQL服务器,或者也许是MySQL,但请说你在用什么。

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

+0

对不起,这将有助于如果我愿意的说我在用。这是SQL Server 2005.我看到你说关于使存储过程检查以查看表是否存在等等。但是,这需要一些必须运行存储过程的权利?我无法自动设置一些如何?我问的原因是因为这个正在为我们创建的程序正在寻找表格数据。所以当程序检查它时,我会希望该表格呈现准确。或者,也许这不是要走的路? – user1288964 2012-03-23 21:40:49

0

我认为你不需要有一个参数。我从来没有写过这样的查询,但你可以说“DATEPART(hh,GETDATE())”和“DATEPART(mm,GETDATE())”分别获得小时和分钟。并且您可以包含测试,看看它在查询中的什么时间。

你可以使用它来摆脱你的if语句和参数。现在您有:

WHERE Shift = 3 AND PartNumber <>'' 

从概念上讲,如果你能说“WHERE移= 什么转变,现在是”,即会做的伎俩。在SQL中,您使用CASE语句。有两种形式;你可以在google上阅读,我将在下面显示“搜索”表单。

如果仅仅是两班倒说从午夜到下午2点是1,其他时间是2班,那么您想知道是否小时< 14。你可以这样说:

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

这有道理吗?根据它运行时,你要么得到转移= 1或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 

希望工程可以尝试测试与服用日期部分是秒而不是。小时,ss是用于秒符号。

+0

而且也摆脱了制作表格的需要;你可以把它放在视图中。 – 2012-03-24 01:11:46

+0

是的,这比我想要做的更有意义......并且还喜欢Paul所说的不需要存储过程,而是使用CASE而不是这是好的,因为我更喜欢这种方法通过存储过程。无论如何,非常感谢你的时间和帮助。对此,我真的非常感激。 – user1288964 2012-03-28 19:18:58

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 <>'' 
+0

对不起,我开始评论回你,并没有完成。但非常感谢你的帮助。这正是我所期待的。我真的很感谢你的帮助! :d – user1288964 2012-03-28 19:14:34