2016-01-21 66 views
-1

我想寫一個有點簡單的存儲過程。我首先要驗證表中是否有任何東西;如果有TRUNCATE它,如果沒有填充一些數據。會發生什麼呢,它會在沒有任何錯誤的情況下執行,但表中沒有任何反應。它就像在執行它之前一樣......空着。存儲過程不在SQL SERVER中執行?

ALTER PROCEDURE [dbo].[LoadReportDataCI] 
AS 
If (Select Count(*) from tbl_TempTableReport)>0 
BEGIN 
    Truncate table tbl_TempTableReport 
    END 

Begin 
INSERT INTO tbl_TempTableReport (userID, VendorID, VendorName, UnitCost, UnitCount, CostValue) 
SELECT 
'1234',  
VendorID, 
VendorName, 
InvValue, 
BegInvOnHand, 
BegCurrentValue 
From vVendorsAndInvONHand 
END 

如果我想強調開始INSERT,直到最後,得到的數據填入表中,否則它不能正常工作。有人點亮一些光?下面的代碼來執行存儲過程

+2

如果你想檢查行的存在,你應該使用存在而不是count。但是,由於截斷速度如此之快,爲什麼都要檢查?只是截斷它。作爲一個附註,你應該避免使用sp_前綴。 http://sqlperformance.com/2012/10/t-sql-queries/sp_prefix –

+1

用'sp_'命名用戶定義的過程是不好的做法。 – lad2025

+1

試着在你之前移動你的第二個開始語句,看看我的回答 – Faisal

回答

1

沒有點,如果有截斷之前有行檢查。截斷比檢查行的存在要快得多。如果沒有行,它仍然會運行得很好。

ALTER PROCEDURE [dbo].[LoadReportDataCI] 
AS 
    Truncate table tbl_TempTableReport; 

    INSERT INTO tbl_TempTableReport 
    (
     userID 
     , VendorID 
     , VendorName 
     , UnitCost 
     , UnitCount 
     , CostValue 
    ) 
    SELECT 
     '1234' 
     , VendorID 
     , VendorName 
     , InvValue 
     , BegInvOnHand 
     , BegCurrentValue 
    From vVendorsAndInvONHand; 
1

使用,我提出你的第二個開始後AS

ALTER PROCEDURE [dbo].[sp_LoadReportDataCI] 
AS 
Begin 
If (Select Count(*) from tbl_TempTableReport)>0 
BEGIN 
    Truncate table tbl_TempTableReport 
    END 

INSERT INTO tbl_TempTableReport (userID, VendorID, VendorName, UnitCost, UnitCount, CostValue) 
SELECT 
'1234',  
VendorID, 
VendorName, 
InvValue, 
BegInvOnHand, 
BegCurrentValue 
From vVendorsAndInvONHand 
END 
+0

它不會填充表格。如果我從插入下來突出顯示,它確實如此。 – barry17

+1

您是否像我一樣移動begin語句? – Faisal

+1

@ barry17,你在運行ALTER腳本後執行了LoadReportDataCI嗎? –

1

我猜你沒有執行存儲過程。在運行ALTER腳本之後,您是否執行了LoadReportDataCI

+1

這是一條評論,而不是答案。 –

相關問題