看到园子里一位朋友用newid()写的,(这里是原文):
select top 10000
replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(lower(left(replace(newid(),
'-', ''), 20)),
'0', 'a'), 1,
'b'), 2, 'c'), 3,
'd'), 4, 'e'), 5,
'f'), 6, 'g'), 7, 'h'), 8, 'i'),
9, 'j') as col
from sys.all_columns ,
sys.all_objects
这里newid()产生一个GUID, 形如"F6BCE480-834B-4FB9-B905-B568B9F9C7A3", (32个字母和数字加4条横线), 理论上是没有重复的. 问题在于, 当把其中的数字转换成字母之后, 产生的字母序列中一个字母可能对应GUID的一个字母, 也可能对应的是一个数字. 换句话说, 当把这个字母序列"翻译"回GUID的时候, 它最多可以对应到2的32次方个不同的GUID, (拿计算器算了下: 4,294,967,296个). 这样先不说出现重复的概率大不大, 至少理论上不能保证说不出现重复的.
其实, 0到10000, 这数字本身就是不重复的, 干脆把他们转换成字母就好了. 这是方法一:
set @n = 0;
while @n<10000
begin
print replace(replace(convert(varchar(5), @n), '0', 'a'), '1', 'b') ---replace('2', 'c')....
set @n = @n+1
end
上面看到的是a, b, c...h, i, j十个字母的组合, 是不是可以用26个字母? 当然是可以的. 不妨把十进制转换成"二十六进制": a = 0, b = 1 .... z = 25. 那么, ba = 26. 好, 没问题, 可以这样:
set @n = 20 -- test
if (@n = 0) set @res = 'a';
else set @res = ''
while @n > 0
begin
set @one = @n%26
set @res = CHAR(@one+97) + @res
set @n = @n/26
end
print @res
上面解决了"二十六进制"的问题. 我们还知道while循环是可以嵌套的, 于是, 可以用"二十六进制"来表示10000个编号. 方法二:
set @n =
在进行SQL数据库维护时,发现有几行记录明显有错误却删除不了,一执行删除命令就提示“已更新或删除的行值要么不能使该行成为唯一行,要么改变了多个行(X行)。”表现为在:数据库中出现了重复的键值或数据,当试图删除时错误提示信息就出来了。问题原因在于建立的几个表都没有关键字,设置好关键字后问题解决。
方法一:这种问题大多由于没有主键引起,可以通过另外加一列主键解决
1、添加主键
ALTER TABLE 表名
add id int identity primary key (注意:必须加identity,否则添加会失败)
2、删除重复数据
可以手动,也可以用查询语句先查找出来再删除
3、删除新添加的主键列,在原有的表上重新设置某一列为主键
方法二:
利用INSERT INTO 做一些小的变换,具体步骤如下:
先将原用的表做个备份,根据条件将满足条件的数据导到新的表来,再将原表清除,最后将备份表中的数据select过来即可。
第一步:在备份表中导入需要的数据
INSERT INTO DataFile_backup
select * from DataFile where year(consumedate)=条件
本文链接
前两天用了 MSsql里的 SSB委托机制,做了一个消息分发的小功能,在这里简单跟大家分享一下方法跟实例.
step 1:perpar database & data
go
Create database Inventory
go
use Inventory
go
Create table inventory
(
TitleId nvarchar(6) not null,
Quantity int not null,
primary key (TitleId,Quantity)
);
go
insert inventory values ('pc1001',100);
insert inventory values ('pc1002',200);
insert inventory values ('pc1003',300);
insert inventory values ('pc1004',400);
step 2: 创建整个SSB的基础框架.
首先创建信息类型
Create Message Type [//mark/v10/types/inventoryresponse]
创建合约
(
[//mark/v10/types/inventory] send by initiator,
[//mark/v10/types/inventoryresponse] send by target
);
创建队列与服务
create service [//mark/v10/services/inventory client]
on queue [inventory client queue]
go
--create inventory service
create queue [inventory queue];
create service [//mark/v10/services/inventory]
on queue [inventory queue]
(
[//mark/v10/contracts/inventorycontract]
);
step 3:发送消息到消息队列中
go
--send message
begin transaction
declare @dialog_id uniqueidentifier
begin dialog conversation @dialog_id
from service [//mark/v10/services/inventory client]
to service '//mark/v10/services/inventory'
on contract [//mark/v10/contracts/inventorycontract]
with encryption = off;
send on conversation @dialog_id message type [//mark/v10/types/inventory]
(
'<InventoryUpdate>
<TitleId>pc1001</TitleId>
<Quantity>102</Quantity>
</InventoryUpdate>'
);
commit transaction;
发送成功后,可以查询 inventory_queue
这里只是查询了两列。
其中conversation_body 就是 我们发出的信息了。
setp 4: 从 inventory queue 中获取信息并更新数据
go
begin transaction
declare @dialog_id uniqueidentifier
declare @message_body xml
declare @amount int;