2016-01-21 83 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

这是一条评论,而不是答案。 –

相关问题