使用表中的值执行存储过程SQL

使用表中的值执行存储过程SQL,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,查看下表: ID Number01 Number02 Number03 ----------------------------------- 1 10 20 4510 2 5 2 545 3 4 4 664 4 10 1 NULL 5 1 4 NULL “Number03”字段是一个计算字段,它是Number01+

查看下表:

ID  Number01  Number02  Number03
-----------------------------------
1   10        20        4510
2   5         2         545
3   4         4         664
4   10        1         NULL
5   1         4         NULL
“Number03”字段是一个计算字段,它是Number01+Number02。我正在使用存储过程来计算它。为什么使用存储过程?因为我有asp.net制作的接口

这是存储过程:

ALTER PROCEDURE _mySP
    (@Number01 decimal(18,0), @Number02 decimal(18,0))
AS
BEGIN
    DECLARE @myCOM1 float
    DECLARE @myCOM2 float

    SET @myCOM1 = @Number1 + 500
    SET @myCOM2 = POWER(@Number2, 2) * 10

    INSERT INTO _myTable(Number01, Number02, Number03) 
    VALUES (@Number01, @Number02, @myCOM1 + @myCOM2)
END
问题是,如何在不逐个输入值的情况下执行存储过程?因为该值已在表中。我想更新“Number03”字段上的所有空值。还知道如何使用游标执行我的问题吗


编辑:我前面的问题似乎太简单了。所以我把它弄得有点复杂。

因为您使用的是SQL Server 2008,所以可以使用a从其他两个字段生成值

如果只想更新表而不执行此操作,可以使用以下SQL:

UPDATE _myTable SET Number03 = ISNULL(Number01,0) + ISNULL(Number02,0)
这将更新所有行

您可以更新SP以获取第三个参数:

ALTER PROCEDURE _mySP
    (
      @Number01 DECIMAL(18, 0) ,
      @Number02 DECIMAL(18, 0) ,
      @IsUpdate BIT = 0
    )
AS
    BEGIN
        IF ( @IsUpdate = 0 )
            BEGIN
                INSERT  INTO _myTable
                        ( Number01 ,
                          Number02 ,
                          Number03
                        )
                VALUES  ( @Number01 ,
                          @Number02 ,
                          ISNULL(@Number01,0) + ISNULL(@Number02,0)
                        )
            END
        ELSE
            BEGIN
                UPDATE  _myTable
                SET     Number03 = ISNULL(Number01,0) + ISNULL(Number02,0)
                WHERE Number03 IS NULL
            END
    END

编辑:我已将
ISNULL
添加到任何
null
数值的计算中,它将使用0

因为您使用的是SQL Server 2008,所以可以使用a从其他两个字段生成值

如果只想更新表而不执行此操作,可以使用以下SQL:

UPDATE _myTable SET Number03 = ISNULL(Number01,0) + ISNULL(Number02,0)
这将更新所有行

您可以更新SP以获取第三个参数:

ALTER PROCEDURE _mySP
    (
      @Number01 DECIMAL(18, 0) ,
      @Number02 DECIMAL(18, 0) ,
      @IsUpdate BIT = 0
    )
AS
    BEGIN
        IF ( @IsUpdate = 0 )
            BEGIN
                INSERT  INTO _myTable
                        ( Number01 ,
                          Number02 ,
                          Number03
                        )
                VALUES  ( @Number01 ,
                          @Number02 ,
                          ISNULL(@Number01,0) + ISNULL(@Number02,0)
                        )
            END
        ELSE
            BEGIN
                UPDATE  _myTable
                SET     Number03 = ISNULL(Number01,0) + ISNULL(Number02,0)
                WHERE Number03 IS NULL
            END
    END

编辑:我已将
ISNULL
添加到任何
null
数字的计算中,它将使用0

以下是您可以执行的操作:

CREATE TABLE #Test(
ID int,
Number1 decimal(18,0),
number2 decimal(18,0),
number3 decimal(18,0))

INSERT INTO #Test
VALUES
(1  , 10, 20, 30),
(2  , 5 , 2,  7),
(3  , 4,  4 , 8),
(4  , 10, 1,  NULL),
(5  , 1,  4,  NULL)

UPDATE #Test
Set Number3 = Number1 + number2

SELECT * FROM #Test
DROP TABLE #Test

下面的示例是如何做到这一点:

CREATE TABLE #Test(
ID int,
Number1 decimal(18,0),
number2 decimal(18,0),
number3 decimal(18,0))

INSERT INTO #Test
VALUES
(1  , 10, 20, 30),
(2  , 5 , 2,  7),
(3  , 4,  4 , 8),
(4  , 10, 1,  NULL),
(5  , 1,  4,  NULL)

UPDATE #Test
Set Number3 = Number1 + number2

SELECT * FROM #Test
DROP TABLE #Test
示例在

如果您真的想使用SP来完成工作,您必须一次完成一个。写一个光标来选择所有具有空值的行,并为通过Number01和Number02的每一行调用SP

我怀疑您的实际示例比您显示的代码要复杂得多。如果您能更详细地了解,我们可能会建议更好的方法。如果它确实如此简单,那么可以使用计算列或简单的update语句。

如果您真的想使用SP来完成这项工作,则必须一次完成一项。写一个光标来选择所有具有空值的行,并为通过Number01和Number02的每一行调用SP


我怀疑您的实际示例比您显示的代码要复杂得多。如果您能更详细地了解,我们可能会建议更好的方法。如果它确实如此简单,那么可以使用计算列或简单的update语句。

您可以这样使用计算列。它将自动填充number03列中的所有数据

CREATE TABLE _myTable(
ID INT IDENTITY(1,1),
Number01  INT,
Number02  INT,
Number03 AS (Number01 + Number02)
)
------或者如果你已经有桌子了

Alter table _myTable Drop column Number03;
Alter table _myTable Add Number03 AS (Number01 + Number02);
-------------根据您在问题中的编辑进行编辑

您仍然可以将此公式放在计算列中。 但是,正如您所问的那样,您可以这样编辑SP

ALTER PROCEDURE _mySP
AS
BEGIN
Update _myTable
set Number03 = ((Number01 + 500) + (POWER(Number02, 2) * 10))
WHERE Number03 is NULL;
END

--------Executing Stored procedure will update table without providing any parameters
Exec _mySP

您可以像这样使用计算列。它将自动填充number03列中的所有数据

CREATE TABLE _myTable(
ID INT IDENTITY(1,1),
Number01  INT,
Number02  INT,
Number03 AS (Number01 + Number02)
)
------或者如果你已经有桌子了

Alter table _myTable Drop column Number03;
Alter table _myTable Add Number03 AS (Number01 + Number02);
-------------根据您在问题中的编辑进行编辑

您仍然可以将此公式放在计算列中。 但是,正如您所问的那样,您可以这样编辑SP

ALTER PROCEDURE _mySP
AS
BEGIN
Update _myTable
set Number03 = ((Number01 + 500) + (POWER(Number02, 2) * 10))
WHERE Number03 is NULL;
END

--------Executing Stored procedure will update table without providing any parameters
Exec _mySP

只需使用update语句从存储过程中的_myTable?Mabey中选择:
update _myspset Number03=Number01+number02
检查上面的问题。。thx.只需从存储过程中的_myTable?Mabey中选择一个update语句:
update _myspset Number03=Number01+number02
检查我上面的问题。。这并不能回答这个问题。若要评论或要求作者澄清,请在其帖子下方留下评论。@Mark-OP明确指出“问题是,我如何在不逐个输入值的情况下执行storeprocedure”,我回答“您不能”“这怎么不是问题的答案呢?我认为这是为了帮助人们理解并成为更好的程序员,”马克说。我的错。这并不能回答这个问题。若要评论或要求作者澄清,请在其帖子下方留下评论。@Mark-OP明确指出“问题是,我如何在不逐个输入值的情况下执行storeprocedure”,我回答“您不能”“这怎么不是问题的答案呢?我认为这是为了帮助人们理解并成为更好的程序员,”马克说。我的错。更新可以更改为
…其中Number03为NULL
,您不需要光标吗?更新可以更改为
…其中Number03为NULL
,您不需要光标吗?