0

次のように、テーブル変数の個々の列を繰り返し設定しようとしています。

declare @reg_data table
(
    I int NOT NULL PRIMARY KEY IDENTITY,
    Y float
)

declare @counter int, @numRows int
SET @counter = 0
SET @numRows = (select MAX(val) + 10 from tableY)

WHILE @counter < numRows
BEGIN
    SET @reg_data.Y = dbo.func1(@counter)       --HOW DO I DO THIS!!!  
    @counter = @counter + 1
END

配列のようなテーブル変数にアクセスできないため、上記は機能しません。次の機能を取得するにはどうすればよいですか?

4

3 に答える 3

1

完全を期すために、CTE とループなしの 1 つのステートメントの例を示します。

DECLARE @reg_data TABLE (
    I INT NOT NULL PRIMARY KEY IDENTITY,
    Y FLOAT
);

WITH cteNum AS (
    SELECT MAX(val) + 10 AS val
    FROM @tableY
    HAVING MAX(val) >= 0
    UNION ALL
    SELECT val-1
    FROM cteNum
    WHERE val > 0
)
INSERT @reg_data(Y)
    SELECT dbo.func1(val)
    FROM cteNum
    OPTION (MAXRECURSION 0);
于 2012-08-11T20:45:04.227 に答える
1

You can't set values in records that doesn't exists, so you need an insert:

WHILE @counter < numRows
BEGIN
    INSERT INTO @reg_data (Y) values (dbo.func1(@counter))
    @counter = @counter + 1
END
于 2012-08-11T16:07:43.130 に答える
0

なぜこれにカーソルを使用するのですか?

UPDATEいくつかのステートメントを書いてみませんか:

WHILE @counter < numRows
BEGIN
    UPDATE @reg_data
    SET Y = dbo.func1(@counter)  
    WHERE I = @counter

    SET @counter = @counter + 1
END

どういうわけか、テーブル変数から識別値( )を読み取ることができる必要があるため、ステートメントでそれを使用して、更新を正確に1つの行(の値で識別される)に適用できます。IUPDATEI

于 2012-08-11T16:02:10.297 に答える