SQL 服务器 - 函数中 while 循环内的更新问题?

SQL Server - Issue with UPDATE inside while loop in a function?

我有一个 table,我愿意用使用函数使用其他列值生成的值填充两列。

注意:我在 Visual Studio 而不是 SQL 服务器中使用 .mdf 文件。

例如,如果 EmployeeName 是 'XYZ',那么密码将是 'XYZ@123',mailid 将是 'XYZ@gmail.com'

程序如下

CREATE FUNCTION [dbo].[fnTempSetAllEmployeeMailIdAndEmployeePassword]()
RETURNS @OutputTable TABLE
(
    EmployeeName NVARCHAR(250),
    TempEmployeeMailId NVARCHAR(250),
    TempEmployeePassword NVARCHAR(250)
)
AS
BEGIN
    DECLARE @Initialiser INT = 1, @NumberOfRowsInTable INT, @TempEmployeeId INT, @TempEmployeeName NVARCHAR(250);

    SELECT @NumberOfRowsInTable = COUNT(*) 
    FROM tbEmployee;

    WHILE(@Initialiser <= @NumberOfRowsInTable)
    BEGIN
        SELECT 
            @TempEmployeeName = [EmployeeName], 
            @TempEmployeeId = [EmployeeId]
        FROM 
            (SELECT 
                 ROW_NUMBER() OVER(ORDER BY [EmployeeId] ASC) AS ROwNumber, 
                 [EmployeeId], [EmployeeName]
             FROM 
                 tbEmployee) AS TempTable
        WHERE 
            RowNumber = @Initialiser;

        UPDATE tbEmployee 
        SET [EmployeeMailId] = LOWER(@TempEmployeeName) + '@gmail.com', 
            [EmployeePassword] = LOWER(@TempEmployeeName) + '@123'
        WHERE [EmployeeId] = @TempEmployeeId;

        SET @Initialiser = @Initialiser + 1;
    END

    INSERT @OutputTable
        SELECT [EmployeeName], [EmployeeMailId], [EmployeePassword] 
        FROM tbEmployee;

    RETURN
END

问题是当我在新的查询文件中执行时,上述语句有效。

但是当我放入函数并尝试更新它时。我不会保存说执行的时候出错了

但是当我评论 UPDATE 命令时保存。

更新在while循环中有问题吗?

这里发生了几件事。

首先,它在函数中不起作用的原因是因为在 SQL 服务器函数中无法更改数据库中的任何内容。您正试图更改 table 中的数据,这是不允许的。它在存储过程中是允许的。

其次,这看起来是一种非常低效的更新方式。对于循环的每次迭代,此代码:

  1. 抓取所有员工,对他们进行排序
  2. 取一行并更新它
  3. 将该行插入到一个 table 变量中以便稍后输出

作为起点,尝试一次性更新 table 中的每一行:

CREATE PROCEDURE dbo.TempSetAllEmployeeMailIdAndEmployeePassword AS
BEGIN
    UPDATE tbEmployee 
    SET [EmployeeMailId] = LOWER(@TempEmployeeName) + '@gmail.com',
        [EmployeePassword] = LOWER(@TempEmployeeName) + '@123';

    SELECT EmployeeName, EmployeeMailID, EmployeePassword
    FROM tblEmployee;
END

如果你遇到了问题,因为你尝试一次更新的行太多,那么也许你可以看看批处理,但这可能是一个单独的主题。