首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用唯一随机值更新sql表中的所有行,而不使用c#中的主键或唯一键。

使用唯一随机值更新sql表中的所有行,而不使用c#中的主键或唯一键。
EN

Stack Overflow用户
提问于 2021-11-24 11:30:31
回答 1查看 83关注 0票数 0

在我的应用程序中,我获取数据库中的所有表。用户将选择要屏蔽的表名和列名。

现在我想用随机生成字符串更新sql表列,它对于每一行都必须是唯一的,而不使用主键或唯一键。

例如,在我的Employeedb中,我有一个表Employee。在Employee表中的列之外,我希望屏蔽name和city列中的数据。如果表包含1000行,我希望更改名称和城市列,每个列都有1000个唯一值。这意味着我想要逐行更新。

名称地址城市拉加夫金奈孟买牧场flatno23 flatno34

这是原始数据

名称地址城市Sbgha flatno34 mmjgujj Lkhhvh flatno23 huughh

这是预期的结果

表有时具有主键..有可能没有主键。

我还有一个qn,我在一个数据表中有这个预期的输出。由于我不能预定义表名和字段数,我如何编写更新qry。

EN

回答 1

Stack Overflow用户

发布于 2021-11-24 11:55:54

我想你会发现我这篇题为的博客文章对这个要求非常有帮助。

(灵感来自马丁·史密斯的this SO answer,在该表扬的地方给予表扬)

它描述了一个内联表值用户定义函数,该函数生成一个包含随机值的表,您可以使用该表来更新数据。

但是,它不能保证这些值的唯一性。为此,在从中进行选择时必须使用DISTINCT

因此,您可能会遇到的一个问题是,结果的值比您生成的值要少,但是对于您在问题中所写的每个表1,000条记录,这可能不是问题,因为每次您调用该函数时,它最多可以生成1,000,000条记录。

为了完整起见,我也将在这里发布代码,但您可能应该在我的博客上阅读这篇文章。此外,在另一篇名为的博客文章中也有这个函数的另一个版本,它可以让你更好地控制随机字符串的内容-即只包含数字的字符串,或者只包含较低数字的字符串。

您需要做的第一件事是创建一个视图,它将为您生成一个新的guid,因为这不能在用户定义的函数中完成:

代码语言:javascript
复制
CREATE VIEW GuidGenerator
AS
    SELECT Newid() As NewGuid

然后,函数代码:(注意:这是更简单的版本)

代码语言:javascript
复制
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

然后,您可以像这样使用它来获得一个不同的随机字符串:

代码语言:javascript
复制
SELECT DISTINCT RandomString 
FROM dbo.RandomStringGenerator(50, 5000); 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70095290

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档