5

次の表があります。

RecordID 
Name
Col1
Col2
....
ColN

およびRecordIDは初期化されBIGINT PRIMARY KEY CLUSTERED IDENTITY(1,1)ますRecordIDName他の列は NULL です。

によって他の列に関する情報を返す関数がありますName

テーブルを初期化するには、次のアルゴリズムを使用します。

  1. ループを作成する
  2. Name行を取得し、その値を選択します
  3. 選択した名前を使用して関数を実行し、その結果を一時変数に保存します
  4. テーブルに一時変数を挿入します
  5. 次のレコードに移動

ループせずにこれを行う方法はありますか?

4

2 に答える 2

5

クロスアプライは基本的にこのために構築されました

SELECT D.deptid, D.deptname, D.deptmgrid
    ,ST.empid, ST.empname, ST.mgrid
FROM Departments AS D
    CROSS APPLY fn_getsubtree(D.deptmgrid) AS ST;

適用の使用

UPDATE some_table
SET some_row = another_row,
    some_row2 = another_row/2
FROM some_table st
  CROSS APPLY
    (SELECT TOP 1 another_row FROM another_table at WHERE at.shared_id=st.shared_id)
WHERE ...

更新ステートメントで相互適用を使用する

于 2012-09-25T13:13:07.247 に答える
3

テーブルに既にレコードがある場合は、単に次のように言えます。

UPDATE MyTable
SET 
    col1 = dbo.col1Method(Name),
    col2 = dbo.col2Method(Name),
    ...

新しいレコードを挿入するときに、RecordID が自動生成されると仮定すると、次のように言うことができます。

INSERT INTO MyTable(Name, Col1, Col2, ...)
VALUES(@Name, dbo.col1Method(@Name), dbo.col2Method(@name), ...)

ここで、@Name には Name 列の値が含まれます。

于 2012-09-25T12:48:19.713 に答える