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 中的数据,这是不允许的。它在存储过程中是允许的。
其次,这看起来是一种非常低效的更新方式。对于循环的每次迭代,此代码:
- 抓取所有员工,对他们进行排序
- 取一行并更新它
- 将该行插入到一个 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
如果你遇到了问题,因为你尝试一次更新的行太多,那么也许你可以看看批处理,但这可能是一个单独的主题。
我有一个 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 中的数据,这是不允许的。它在存储过程中是允许的。
其次,这看起来是一种非常低效的更新方式。对于循环的每次迭代,此代码:
- 抓取所有员工,对他们进行排序
- 取一行并更新它
- 将该行插入到一个 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
如果你遇到了问题,因为你尝试一次更新的行太多,那么也许你可以看看批处理,但这可能是一个单独的主题。