Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQLServer存储过程中使用变量_Sql_Sql Server_Variables_Stored Procedures - Fatal编程技术网

在SQLServer存储过程中使用变量

在SQLServer存储过程中使用变量,sql,sql-server,variables,stored-procedures,Sql,Sql Server,Variables,Stored Procedures,我在SQL Server存储过程中使用了一个变量,我对此有问题 我想在表中插入数据,但在插入之前,我想检查它是否已经存在,然后我只更新该行 在查询中它可以正常工作,但在存储过程中它不能正常工作 我的问题是 create proc AddPeople @Code nvarchar(50), @Name nvarchar(50) as begin declare @PeopleID bigint select @PeopleID = id from tbl

我在SQL Server存储过程中使用了一个变量,我对此有问题

我想在表中插入数据,但在插入之前,我想检查它是否已经存在,然后我只更新该行

在查询中它可以正常工作,但在存储过程中它不能正常工作

我的问题是

create proc AddPeople
    @Code nvarchar(50),
    @Name nvarchar(50)
as
begin
    declare @PeopleID bigint

    select @PeopleID = id 
    from tbl_People 
    where code = @Code

    if @PeopleID is Null
    begin
        INSERT INTO tbl_People(Code, Name)
        VALUES(@Code, @Name) 

        SELECT @PeopleID = @@IDENTITY
    end
    else
    begin
        UPDATE tbl_People 
        SET Name = @name 
        WHERE id = @PeopleID
    end

    select @PeopleID as id
end

在第一个“if”@PeopleID始终为NULL,存储过程将该行插入表中,但我有代码如果
id
没有默认值,您所描述的会发生什么。通常,这样的
id
将被声明为
notnull identity()
。在你的桌子上是真的吗

注意:您不需要匹配
id
。你可以做:

if (exists (select 1 from tbl_People where code = @Code))
对于条件逻辑,然后:

update tbl_People set Name = @Name where code = @Code;

似乎
code
在表中是唯一的,因此可能根本不需要
id
列。

您的代码有什么问题吗?在代码中,始终设置@peopleID=NULL并始终插入peoplei想要的人如果我的表中有@code,只需更新行就可以了。您确定要执行此存储过程吗?有时候,如果您在master或dbo以外的模式中意外地有一个,那么可能会混淆到底是哪一个在运行。尝试在其中放入print语句或其他内容,以便确保这是正在执行的语句,并打印出代码和PeopleID的值。另外,如果能看到您要插入的表的定义,那就太好了。我还建议使用
SCOPE\u IDENTITY()
,而不是使用任何其他方法(如
@@IDENTITY
)来获取新插入的标识值。我在这个表中有170000行,并且在另一个表中使用ID,代码列的类型是nvarchar,所以根据这个条件进行搜索需要时间和使用cpu@mpourbafrani . . . 如果您关心的是性能,您只需要适当的索引。感谢您今天我使用@peopleid=max(id)而不是@peopleid=id及其工作