步骤4:cast(rand()*(999999-100000)+100000 as nvarchar(6)) cast的作用是类型转换,将随机数转化为nvarchar(6),得到的结果就是我们需要的随机数了。
图片:20120924010548554.png
问题2:更新每一条数据的某一字段 想法1:
UPDATE [test].[dbo].[my_table] SET [test_rand] = cast(rand()*(999999-100000)+100000 as nvarchar(6))
这种想法是有多天真啊。这样更新下来只能导致这个字段变成相同的一个随机值。
图片:20120924010548411.png
想法2:写一段程序,每次调用想法1,直到所有数据发生变化,这个也是相当的天真。首先,需求本身要求的就是SQL脚本来实现,所有即使是写好了程序也是无用功,而且这样的做法本身就很垃圾。每次要连接一次数据库,如果上万条就要连接上万次。不可取。 想法3:想来想去,首先一定要有循环才能实现。但是循环标志是什么呢。经过向前辈的虚心求教(心虚~~),提示由游标这个东西可以实现。因为本身对SQL接触甚少,原谅我不知道有这个东西。 步骤1:声明游标 DECLARE user_extension_cursor CURSOR FOR SELECT id FROM [mtrade].[dbo].[user] 声明游标的时候指定游标指的是数据库的哪一个字段。(在这里只能选择作为主键的id)
步骤2:需要用FETCH来获取游标 FETCH NEXT FROM user_extension_cursor INTO @user_id 步骤3:循环更新字段的值
WHILE @@FETCH_STATUS = 0 BEGIN UPDATE [mtrade].[dbo].[user] SET [user].[extension] = cast(rand()*(999999-100000)+100000 as nvarchar(6)) WHERE id = @user_id FETCH NEXT FROM user_extension_cursor INTO @user_id END
-- 更新 my_table 的 test_rand 字段 DECLARE @user_id varchar(36) DECLARE user_extension_cursor CURSOR FOR SELECT id FROM [test].[dbo].[my_table] OPEN user_extension_cursor; FETCH NEXT FROM user_extension_cursor INTO @user_id
WHILE @@FETCH_STATUS = 0 BEGIN UPDATE [test].[dbo].[my_table] SET [my_table].test_rand = cast(rand()*(999999-100000)+100000 as nvarchar(6)) WHERE id = @user_id FETCH NEXT FROM user_extension_cursor INTO @user_id END CLOSE user_extension_cursor; DEALLOCATE user_extension_cursor; ---