2012-03-23 68 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