高级问题:我想更新现有表,用随机生成的 32 字节、base64 编码的数据填充现有列。每行的随机数据应该不同。
暂时忽略 base64 编码要求,解决方案很简单,如以下示例代码所示:
DECLARE @table TABLE (
id int,
bin varbinary(max) null
)
-- put a few rows in the table
insert into @table (id) values (1)
insert into @table (id) values (2)
insert into @table (id) values (3)
-- perform the update
update @table
set bin = CRYPT_GEN_RANDOM(32)
-- check result
select *
from @table
这按预期工作。CRYPT_GEN_RANDOM(32)
为每个更新的行生成不同的值。现在尝试添加 base64 编码要求:
DECLARE @table TABLE (
id int,
txt nvarchar(max) null
)
-- put a few rows in the table
insert into @table (id) values (1)
insert into @table (id) values (2)
insert into @table (id) values (3)
-- perform the update
update @table
set txt = (SELECT CRYPT_GEN_RANDOM(32) FOR XML PATH(''), BINARY BASE64)
-- check result
select *
from @table
这不起作用:它会在每一行中放置相同的值。我尝试将 base64 编码打包到 UDF 中,看看是否有帮助:
CREATE FUNCTION ConvertBytesToBase64
(
@bytes varbinary(max)
)
RETURNS nvarchar(max)
AS
BEGIN
DECLARE @result nvarchar(max)
SET @result = (SELECT @bytes FOR XML PATH(''), BINARY BASE64)
RETURN @result
END
GO
然后更新语句变成:
update @table
set txt = ConvertBytesToBase64(CRYPT_GEN_RANDOM(32))
但这仍然会在每一行产生相同的值。
我根本不明白的是,既然 SQL Server 会评估CRYPT_GEN_RANDOM(32)
每一行(这似乎是合理的),为什么不评估ConvertBytesToBase64(CRYPT_GEN_RANDOM(32))
每一行?我怎样才能让它评估每一行?(也许相关,在 SQL Server 2019+ 中是否有更好的方法进行 base64 编码?)