我有两个表,比如Table1(Col1,Col2,Col3,Col4)和Table2(Col1)。
我想更新Table1中的一些col。
对于Table1中Col1以'001'结尾的每一行(假设所有值至少为长度为4),我想:
1.在Col2中放置一组随机数(10,20,30,40,50,60,70,80,90)。
2.在Col3中放置一个随机的9位数字。
3.从Table1 Col4中的Table2 Col1中放置一个随机值。
我该怎么做?
谢谢!
答案 0 :(得分:1)
我认为这可以帮助你开始正确的道路。
构建一个样本数据表,其中包含适合您需求的递增数字。您可以使用循环,但如果您要执行多行,则tally table或a recursive CTE会更快。然后,使用示例数据Table1
更新ORDER BY NEWID()
的相应列。这将随机化选择集的顺序。
UPDATE Table1
SET Col1 = (SELECT TOP 1 RandomColumn1
FROM SampleData
ORDER BY NEWID())
您还可以看到 RedGate's Data Generator 是否适合您。我有它,但从未使用它。
答案 1 :(得分:1)
CREATE TABLE MyTable(
RowID int IDENTITY(1,1),
Col1 int,
Col2 int,
Col3 int,
Col4 int。
)
DECLARE @RowCount int,
@numberRecords int
select @NumberRecords = count(*) from mytable
SET @RowCount = 1
WHILE @RowCount <= @NumberRecords
BEGIN
UPDATE MyTable
SET Col1 = (SELECT TOP 1 RandomColumn1
FROM SampleData
ORDER BY NEWID())
WHERE RowID = @RowCount
SET @RowCount = @RowCount + 1
END
希望这是一些帮助...扩展我的答案..你可以看到我创建你的表,但添加一个递增的行id列。然后创建一个循环,在每行上运行更新语句行基础。
非常类似于光标的运行方式,但希望更快。
答案 2 :(得分:0)
我倾向于使用这样的东西:
WITH SampleData (entity_number, entity_name)
AS (
... row constructors here...
),
SampleDataOrdered (order_col, entity_number, entity_name)
AS (
SELECT ROW_NUMBER() OVER(ORDER BY NEWID()),
S1.entity_number, S1.entity_name
FROM SampleData AS S1
)
MERGE INTO MyBaseTable...;
答案 3 :(得分:0)
我更喜欢始终使用基于集合的解决方案。这是我开发的基于集合的解决方案。我测试了它并且它有效。
Update Table1
Set Col2 = (Cast(CAST(newid() AS binary(1)) AS int) % 9 + 1) *10
Where Substring(Table1.Col1,len(Table1.Col1)-2,3) = '001'
Update Table1
Set Col3 = Cast(CAST(newid() AS binary(3)) AS int)
Where Substring(Table1.Col1,len(Table1.Col1)-2,3) = '001'
Create table #temp1(tCol1 varchar(50),
tCol2 varchar(10),randomnum varchar(max) )
Insert Into #temp1
Select Table1.Col1,Table2.Col1,newid() as random1
From Table1
Cross Join Table2
Where Substring(Table1.Col1,len(Table1.Col1)-2,3) = '001'
Update Table1
Set Table1.Col4 = tCol2
From (
Select tCol1,tCol2,a.randomnum
From (
Select Max(randomnum) As randomnum
From #temp1 Group By tCol1
) a
Left Join #temp1 On a.randomnum = #temp1.randomnum
) b
Inner Join Table1 On b.tCol1 = Table1.Col1
Drop table #temp1
答案 4 :(得分:0)
我更愿意运行以下代码并等待一段时间来运行并更新随机值
while 1=1
BEGIN
UPDATE top (10) a
SET value =rand() * 100
from (select top 10 * from
MyTable
order by newid()
) a
END