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

时间:2014-07-14 08:00:45

标签: 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" field是计算字段,即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"的所有空值。领域。还有任何想法如何使用CURSOR执行我的问题?

编辑:我的上一个问题似乎太简单了。所以我让它变得复杂一点。

4 个答案:

答案 0 :(得分:2)

由于您使用的是SQL Server 2008,因此可以使用computed field从其他两个字段生成值。

如果您只是想在不执行此操作的情况下更新表,则可以使用以下SQL:

UPDATE _myTable SET Number03 = ISNULL(Number01,0) + ISNULL(Number02,0)

这将更新所有行。

您可以更新SP以获得第3个参数:

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

答案 1 :(得分:1)

如果确实想要使用SP来完成工作,则必须一次执行一项操作。写一个游标来选择所有具有NULL值的行,并为传递Number01和Number02的每一行调用SP。

我怀疑你的实际例子比你所展示的代码复杂得多。如果您能够详细了解我们可能会提出更好的方法。如果确实这么简单,那么计算列或简单的更新语句就是最佳选择。

答案 2 :(得分:1)

您可以像这样使用计算列。它会自动填充 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);

------------- 根据您在问题中的编辑进行编辑

您仍然可以将此公式放在计算列中。 但是,当你问另一种方式时,你可以像这样编辑你的

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

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

SQLFiddle

的示例