T-SQL 使用函数更新表列

Posted

技术标签:

【中文标题】T-SQL 使用函数更新表列【英文标题】:T-SQL Update table columns using function 【发布时间】:2012-09-25 12:33:52 【问题描述】:

我有下表:

RecordID 
Name
Col1
Col2
....
ColN

RecordIDBIGINT PRIMARY KEY CLUSTERED IDENTITY(1,1)RecordIDName 已初始化。其他列是 NULL。

我有一个函数通过Name返回有关其他列的信息。

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

    创建循环 获取一行,选择其Name值 使用所选名称执行函数,并存储其结果 在临时变量中 在表中插入临时变量 移至下一条记录

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

【问题讨论】:

【参考方案1】:

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;

Using APPLY

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 ...

using cross apply in an update statement

【讨论】:

【参考方案2】:

如果表中已有记录,则可以简单地说如下。

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

【讨论】:

我只有一个功能。如果我这样使用in,是缓存结果,还是只针对一行执行多次? 如果您只有一个方法可以被调用来填充一列,那么该函数将被调用与数据库中存在的行数一样多。如果你想限制这应该运行的行集,你显然可以指定一个 WHERE 子句来限定这些行集。 是的,我知道这一点。我想为每一行执行函数。我的观点是,这些函数返回 10 列,而不是一列。 我没有得到一个函数调用返回给定行的所有列。无论如何,我看到你从另一个答案中得到了你想要的。 这是最简单的答案。使用函数的输出更新列是一种非常基本、非常有用的方法。

以上是关于T-SQL 使用函数更新表列的主要内容,如果未能解决你的问题,请参考以下文章

T-SQL 枢轴?从行值创建表列的可能性

T-SQL 根据另一表列过滤一列上的多个值

子选择 T-SQL 中的聚合函数

T-SQL基于分隔符拆分列并将拆分后的字符串数组输入到多个表列中

T-SQL_常用内置函数和操作

在 SQL Server 2008 的拆分函数中使用连接表列