2014-09-03 64 views
0

嵌入式SQL函數是否有可能創建一個函數/過程,它可以在一個SQL語句中使用這樣的:有時必須更新數據庫

INSERT INTO Journal(ProductID,Quantity) VALUES(LookupOrCreateProduct('12345678'),5)

LookupOrCreateProduct應該尋找一個產品表通過串(條形碼)和:
*如果條形碼被發現 - 收益產品ID
*如果找不到條形碼 - 創建Products表與新的條形碼的新紀錄,並返回其ID

我探索的SQL Server函數,但它們不允許INSERT或函數體內的任何其他數據庫修改。存儲過程可以返回值,但它們只能是int類型。我的ID欄是bigint。另一個選擇是使用輸出參數,但是我不清楚,我怎樣才能將它內聯到SQL語句中。謝謝。

+0

設置輸出參數,並從存儲過程返回,並將其保存到變量,然後用它爲您的插入查詢... – 2014-09-03 15:49:28

+0

你不能這樣做的功能。 [你應該使用OUTPUT參數,而不是RETURN值](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/09/bad-habits-to-kick-using-select-or-return -instead-的-output.aspx)。返回值用於錯誤/狀態代碼,不適用於數據;其中一個主要原因正是你發現的:它們只對整數有用。 – 2014-09-03 16:25:08

回答

2
CREATE PROCEDURE LookupOrCreateProduct 
    @BarCode VARCHAR(100), 
    @ProductID BIGINT OUTPUT 
AS 
BEGIN 
    SET NOCOUNT ON; 


     SELECT TOP 1 @ProductID = ProductID 
     FROM dbo.Products 
     WHERE BarCode = @BarCode 

    IF(@ProductID IS NULL) 
    BEGIN 
     INSERT INTO dbo.Products(Barcode) 
     VALUES (@BarCode) 

     SET @ProductID = SCOPE_IDENTITY(); 
    END 

END 
+0

爲什麼'IF EXISTS'檢查?即使BarCode被索引,這也是浪費額外的檢查。 'SELECT @ProductID ='...'IF @ProductID IS NULL'然後插入。 – 2014-09-03 16:27:39

+0

@AaronBertrand當然,這樣做更有意義,謝謝你的指針:) – 2014-09-03 16:50:42

1

我認爲你能做的最好的是在存儲過程中的輸出參數:Bigint數據類型的

declare @product_id int; 

begin transaction; 

exec dbo.LookupOrCreateProduct '12345678', @product_id out; 

insert into journal (productId, quantity) values (@product_id, 5); 

commit transaction;