如果在存储过程sql server中也是如此

Hub*_*cki 35 sql-server stored-procedures

我创建了一个存储过程如下:

Create Procedure sp_ADD_USER_EXTRANET_CLIENT_INDEX_PHY
(
@ParLngId int output
)
as
Begin
    SET @ParLngId = (Select top 1 ParLngId from T_Param where ParStrNom = 'Extranet Client')
    if(@ParLngId = 0)
        begin
            Insert Into T_Param values ('PHY', 'Extranet Client', Null, Null, 'T', 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1, NULL, NULL, NULL)
            SET @ParLngId = @@IDENTITY
        End
    Return @ParLngId
End
Run Code Online (Sandbox Code Playgroud)

所以我设置了一个变量@ParLngId,我检查表中是否有这样的数据,如果是,我返回值,如果不是我插入一个并返回包含插入行的Id的变量...但是现在它显示我是一个SqlException:

子查询返回了更多值.当子查询跟随=时,这是不允许的!=,<,<=,>,> =或者当用作表达式时.

有人有解决方案吗?

Hub*_*cki 45

谢谢大家的答案,但我想出了怎么做,最后的程序看起来像这样:

Create Procedure sp_ADD_RESPONSABLE_EXTRANET_CLIENT
(
@ParLngId int output
)
as
Begin
if not exists (Select ParLngId from T_Param where ParStrIndex = 'RES' and ParStrP2 = 'Web')
    Begin
            INSERT INTO T_Param values('RES','¤ExtranetClient', 'ECli', 'Web', 1, 1, Null, Null, 'non', 'ExtranetClient', 'ExtranetClient', 25032, Null, 'informatique.interne@company.fr', 'Extranet-Client', Null, 27, Null, Null, Null, Null, Null, Null, Null, Null, 1, Null, Null, 0 )
            SET @ParLngId = @@IDENTITY
    End
Else
    Begin
            SET @ParLngId = (Select top 1 ParLngId from T_Param where ParStrNom = 'Extranet Client')
            Return @ParLngId
    End   
End
Run Code Online (Sandbox Code Playgroud)

所以我发现并使其有效的是:

如果不存在

它允许我们使用布尔值而不是Null0count()得到的数字


Ale*_* K. 11

如果没有匹配的行/秒,然后@ParLngIdNULL不为零,所以你需要IF @ParLngId IS NULL.

你也应该使用SCOPE_IDENTITY()而不是@@IDENTITY.


Dev*_*art 7

试试这个——

CREATE PROCEDURE sp_ADD_USER_EXTRANET_CLIENT_INDEX_PHY
AS
BEGIN

    DECLARE @ParLngId INT
    SELECT TOP 1 @ParLngId = ParLngId
    FROM dbo.T_Param
    WHERE ParStrNom = 'Extranet Client'

    IF (@ParLngId = 0)
    BEGIN
        INSERT INTO dbo.T_Param
        VALUES ('PHY', 'Extranet Client', NULL, NULL, 'T', 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1, NULL, NULL, NULL)

        RETURN SCOPE_IDENTITY()
    END
    ELSE BEGIN

        RETURN @ParLngId 

    END

END
Run Code Online (Sandbox Code Playgroud)