在我的应用程序中,我获取数据库中的所有表。用户将选择要屏蔽的表名和列名。
现在我想用随机生成字符串更新sql表列,它对于每一行都必须是唯一的,而不使用主键或唯一键。
例如,在我的Employeedb中,我有一个表Employee。在Employee表中的列之外,我希望屏蔽name和city列中的数据。如果表包含1000行,我希望更改名称和城市列,每个列都有1000个唯一值。这意味着我想要逐行更新。
名称地址城市拉加夫金奈孟买牧场flatno23 flatno34
这是原始数据
名称地址城市Sbgha flatno34 mmjgujj Lkhhvh flatno23 huughh
这是预期的结果
表有时具有主键..有可能没有主键。
我还有一个qn,我在一个数据表中有这个预期的输出。由于我不能预定义表名和字段数,我如何编写更新qry。
发布于 2021-11-24 11:55:54
我想你会发现我这篇题为的博客文章对这个要求非常有帮助。
(灵感来自马丁·史密斯的this SO answer,在该表扬的地方给予表扬)
它描述了一个内联表值用户定义函数,该函数生成一个包含随机值的表,您可以使用该表来更新数据。
但是,它不能保证这些值的唯一性。为此,在从中进行选择时必须使用DISTINCT。
因此,您可能会遇到的一个问题是,结果的值比您生成的值要少,但是对于您在问题中所写的每个表1,000条记录,这可能不是问题,因为每次您调用该函数时,它最多可以生成1,000,000条记录。
为了完整起见,我也将在这里发布代码,但您可能应该在我的博客上阅读这篇文章。此外,在另一篇名为的博客文章中也有这个函数的另一个版本,它可以让你更好地控制随机字符串的内容-即只包含数字的字符串,或者只包含较低数字的字符串。
您需要做的第一件事是创建一个视图,它将为您生成一个新的guid,因为这不能在用户定义的函数中完成:
CREATE VIEW GuidGenerator
AS
SELECT Newid() As NewGuid然后,函数代码:(注意:这是更简单的版本)
CREATE FUNCTION dbo.RandomStringGenerator
(
@Length int,
@Count int -- Note: up to 1,000,000 rows
)
RETURNS TABLE
AS
RETURN
-- An inline tally table with 1,000,000 rows
WITH E1(N) AS (SELECT N FROM (VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10)) V(N)), -- 10
E2(N) AS (SELECT 1 FROM E1 a, E1 b), --100
E3(N) AS (SELECT 1 FROM E2 a, E2 b), --10,000
Tally(N) AS (SELECT ROW_NUMBER() OVER (ORDER BY @@SPID) FROM E3 a, E2 b) --1,000,000
SELECT TOP(@Count) (
SELECT TOP (@Length) CHAR(
-- create a random number from a guid using the GuidGenerator view, mod 3.
CASE Abs(Checksum(NewGuid)) % 3
WHEN 0 THEN 65 + Abs(Checksum(NewGuid)) % 26 -- Random upper case letter
WHEN 1 THEN 97 + Abs(Checksum(NewGuid)) % 26 -- Random lower case letter
ELSE 48 + Abs(Checksum(NewGuid)) % 10 -- Random digit
END
)
FROM Tally As t0
CROSS JOIN GuidGenerator
WHERE t0.n != -t1.n -- Needed for the subquery to get re-evaluated for each row
FOR XML PATH('')
) As RandomString
FROM Tally As t1然后,您可以像这样使用它来获得一个不同的随机字符串:
SELECT DISTINCT RandomString
FROM dbo.RandomStringGenerator(50, 5000); https://stackoverflow.com/questions/70095290
复制相似问题