0

这是如果 Hit > 0 SQL 服务器应该返回 false 并更新表的场景。我的语法有问题。

Create PROCEDURE [dbo].[sp_CheckTransactionExist_TransID]

@TransID int

AS

Declare @Hits bit
Declare @Hit bigint

SET @Hit = 0


Select @Hit = @Hit + count(1)  From tblBooking Where (TransID = @TransID)
Select @Hit = @Hit + count(1)  From tblOrders Where (TransID = @TransID) 
Select @Hit = @Hit + count(1)  From tblTransaction_DP Where (TransID = @TransID)


if @Hit > 0 then
    begin
        @Hits = True
    end
else
    begin
        @Hits = False
        update tblTransaction set isVoid = 1 where (Transid = @TransID)
    end

Select @Hits

我有这些错误:关键字 then 和 select 附近的语法不正确。

4

2 回答 2

1

整个身体可以替换为:

if exists(select * from tblBooking Where TransID = @TransID)
  or exists(select * from tblOrders where TransID = @TransID)
  or exists(select * from tblTransaction_DP Where TransID = @TransID)
begin
    select 1
end
else
begin
    update tblTransaction set isVoid = 1 where (Transid = @TransID)
    select 0
end

笔记:

  • 如果您只关心行是否存在,请不要计算行数
  • thenT-SQL语句中没有if
  • SQL Server 中没有布尔类型true,所以没有像or这样的布尔文字false
  • sp_您不应该以;开头命名您的存储过程。该前缀是为 Microsoft 的系统过程保留的。如果 MS 在数据库中添加一个与您的同名的系统过程,系统过程将被使用而不是您的:master

我们强烈建议您不要在过程名称中使用前缀sp_ 。SQL Server 使用此前缀来指定系统存储过程。有关详细信息,请参阅创建存储过程(数据库引擎)

  • 如果返回值的数据类型很重要,您可以替换select 0select CONVERT(bit,0)select 1select CONVERT(bit,1)。没有指定位文字的简写。
  • 如果要设置变量的值,则必须使用SET语句(或 a SELECT)。你不能只分配给一个变量。
于 2013-05-17T06:57:41.317 回答
0

试试这个——

CREATE PROCEDURE [dbo].[usp_CheckTransactionExist_TransID]

@TransID INT

AS BEGIN

    IF EXISTS(
        SELECT 1 
        FROM dbo.tblBooking 
        WHERE TransID = @TransID

        UNION

        SELECT 1 
        FROM dbo.tblOrders 
        WHERE TransID = @TransID

        UNION

        SELECT 1 
        FROM dbo.tblTransaction_DP 
        WHERE TransID = @TransID
    ) BEGIN

        RETURN 1

    END
    ELSE BEGIN

        UPDATE dbo.tblTransaction 
        SET isVoid = 1 
        WHERE Transid = @TransID

        RETURN 0

    END

END
于 2013-05-17T08:09:41.460 回答