5

我有下表:

RecordID 
Name
Col1
Col2
....
ColN

RecordIDisBIGINT PRIMARY KEY CLUSTERED IDENTITY(1,1)和被RecordID初始化Name。其他列是 NULL。

我有一个函数,它返回有关其他列的信息Name

要初始化我的表,我使用以下算法:

  1. 创建一个循环
  2. 获取一行,选择它的Name
  3. 使用选定的名称执行函数,并将其结果存储在临时变量中
  4. 在表中插入临时变量
  5. 移动到下一条记录

有没有办法在不循环的情况下做到这一点?

4

2 回答 2

5

Cross apply 基本上就是为此而建的

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 包含名称列的值。

于 2012-09-25T12:48:19.713 回答