求一SQL语句

fjtxwd 2009-08-03 08:13:52
有一张表table,两个字段a和b,表为空表
我想一下子插入1000条记录
a字段是从1到1000
b字段是1-3的随机数

a b
---------
1 3
2 1
3 3
4 2
5 1

。。。。。
1000 3
...全文
56 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
soft_wsx 2009-08-03
  • 打赏
  • 举报
回复
--说明
CHECKSUM
返回在表的行上或在表达式列表上计算的校验值。CHECKSUM 用于生成哈希索引。

语法
CHECKSUM ( * | expression [ ,...n ] )

参数
*

指定在表的所有列上进行计算。如果有任一列是非可比数据类型,则 CHECKSUM 返回错误。不可比数据类型是 text、ntext、image、cursor 以及基本类型为前 4 个数据类型之一的 sql_variant。

expression

是除非可比数据类型之外的任何类型的表达式。

返回类型
int

注释
CHECKSUM 在其参数列表上计算一个称为校验值的哈希值。此哈希值用于生成哈希索引。如果 CHECKSUM 的参数是列,且在计算的 CHECKSUM 值上生成索引,则其结果是可用于在列上等价搜索的哈希索引。

CHECKSUM 满足哈希函数的下列属性:在使用等于 (=) 运算符比较时,如果两个列表的相应元素具有相同类型且"相等",则在任何两个表达式列表上应用的 CHECKSUM 将返回同一值。这种定义的目的在于:给定类型的 NULL 值被作为"相等"进行比较。如果表达式列表中的某个值发生变化,那么列表的校验值通常也会变化。但只在极少数情况下,校验值会保持不变。

BINARY_CHECKSUM 和 CHECKSUM 具有相似的功能:它们可用于计算表达式列表上的校验值,且表达式的顺序将影响结果值。在 CHECKSUM(*) 中使用的列顺序是在表或视图定义中指定的列顺序,包括计算列。

CHECKSUM 和 BINARY_CHECKSUM 仅为字符串数据类型返回不同的值,这类字符串的区域设置可能导致具有不同表示法的字符串进行等值比较。字符串数据类型是 char、varchar、nchar、nvarchar 或 sql_variant(如果其基本类型是字符串数据类型)。例如,字符串"McCavity"和"Mccavity"的 BINARY_CHECKSUM 值不同。反之,在不区分大小写的服务器中,上述字符串的 CHECKSUM 返回相同的校验值。CHECKSUM 值不应与 BINARY_CHECKSUM 值进行比较。

示例
使用 CHECKSUM 生成哈希索引
CHECKSUM 函数可以用于生成哈希索引。通过将计算校验值列添加到索引的表中,然后在校验值列上生成索引来生成哈希索引。

-- Create a checksum index.
SET ARITHABORT ON
USE Northwind
GO
ALTER TABLE Products
ADD cs_Pname AS checksum(ProductName)
CREATE INDEX Pname_index ON Products (cs_Pname)

校验值索引可用作哈希索引,尤其是当要索引的列为较长的字符列时可以提高索引速度。校验值索引可用于等价搜索。

/*Use the index in a SELECT query. Add a second search
condition to catch stray cases where checksums match,
but the values are not identical.*/
SELECT *
FROM Products
WHERE checksum(N'Vegie-spread') = cs_Pname
AND ProductName = N'Vegie-spread'

在计算列上创建的索引将具体化为校验值列,对 ProductName 值所做的任何更改将传播到校验值列。索引也可以直接建立在索引的列上。然而,如果键值较长,则很可能不执行校验值索引甚至常规索引。
XTMENG 2009-08-03
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 htl258 的回复:]
SQL code--2005insert[table]selecttop1000 a=row_number()over(orderbygetdate()),b=abs(checksum(newid()))%3+1from sysobjects,syscolumns
[/Quote]
soft_wsx 2009-08-03
  • 打赏
  • 举报
回复
本来想说两句,来晚了,呵呵
fjtxwd 2009-08-03
  • 打赏
  • 举报
回复
回复的太快还没来得及刷新,呵呵
fjtxwd 2009-08-03
  • 打赏
  • 举报
回复
谢谢大家
htl258_Tony 2009-08-03
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 fjtxwd 的回复:]
用了你的语句后a列全部是NULL
自增出不来
[/Quote]
我上面有备注:如果A列的属性是自增列,如果不是,我写在2.4楼的
fjtxwd 2009-08-03
  • 打赏
  • 举报
回复
用了你的语句后a列全部是NULL
自增出不来
htl258_Tony 2009-08-03
  • 打赏
  • 举报
回复
--2005
insert [table]
select top 1000 a=row_number()over(order by getdate()),b=abs(checksum(newid()))%3+1 from sysobjects,syscolumns
水族杰纶 2009-08-03
  • 打赏
  • 举报
回复
set nocount on
if object_id('tempdb..#')is not null drop table #
go
create table tempdb..#(a int , b int)
declare @i int
set @i=1
while @i<=1000
begin
insert tempdb..# select @i,cast(rand()*2+1 as dec(38,0))
set @i=@i+1
end
go
select * from tempdb..#
htl258_Tony 2009-08-03
  • 打赏
  • 举报
回复
--如果不是自增列:
select top 1000 a=identity(int),b=abs(checksum(newid()))%3+1 into # from sysobjects,syscolumns
insert [table] select * from #
drop table #
htl258_Tony 2009-08-03
  • 打赏
  • 举报
回复
--假定A是自增列:
insert [table](b)
select top 1000 abs(checksum(newid()))%3+1 from sysobjects,syscolumns

34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧