内联SQL函数有时必须更新数据库

时间:2014-09-03 15:43:27

标签: sql sql-server inline-functions

是否可以创建一个函数/过程,可以在这样的SQL语句中使用:

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

LookupOrCreateProduct应该按字符串(条形码)查找产品表,并且:
*如果找到条形码 - 返回产品编号
*如果未找到条形码 - 使用新条形码在Products表中创建新记录并返回其ID

我探索了SQL Server函数,但它们不允许INSERT或函数体内的任何其他数据库修改。存储过程可以返回值,但它们只能是int类型。我的ID列为bigint。另一种选择是使用输出参数但是我不清楚,我如何在SQL语句中内联它。谢谢。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

我认为您可以做的最好的事情是存储过程中的输出参数:

declare @product_id int;

begin transaction;

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

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

commit transaction;