当前位置:  数据库>sqlserver
本页文章导读:
    ▪T-SQL: 用26个字母字母表示10000条不重复的编号      看到园子里一位朋友用newid()写的,(这里是原文):insert into T select top 10000 replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(lower(left(replace(newid(), .........
    ▪SQL:已更新或删除的行值要么不能使该行成为唯一行,要么改变了多个行      在进行SQL数据库维护时,发现有几行记录明显有错误却删除不了,一执行删除命令就提示“已更新或删除的行值要么不能使该行成为唯一行,要么改变了多个行(X行)。”表现为在:数据库.........
    ▪SSB(SQLservice Service Broker) 入门实例      前两天用了 MSsql里的 SSB委托机制,做了一个消息分发的小功能,在这里简单跟大家分享一下方法跟实例.step 1:perpar database & datause mastergoCreate database Inventorygouse InventorygoCreate table inventory( .........

[1]T-SQL: 用26个字母字母表示10000条不重复的编号
    来源:    发布时间: 2013-10-18

看到园子里一位朋友用newid()写的,(这里是原文):

insert into T
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, 这数字本身就是不重复的, 干脆把他们转换成字母就好了. 这是方法一:

declare @n int
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. 好, 没问题, 可以这样:

declare @one int, @n int, @res varchar(5)
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个编号. 方法二:

declare @n int
set @n =
    
[2]SQL:已更新或删除的行值要么不能使该行成为唯一行,要么改变了多个行
    来源:    发布时间: 2013-10-18

在进行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)=条件

本文链接


    
[3]SSB(SQLservice Service Broker) 入门实例
    来源:    发布时间: 2013-10-18

前两天用了 MSsql里的 SSB委托机制,做了一个消息分发的小功能,在这里简单跟大家分享一下方法跟实例.

step 1:perpar database & data

use master
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/inventory]
Create Message Type [//mark/v10/types/inventoryresponse]

 创建合约 

Create contracts [//mark/v10/contracts/inventorycontract]
(
[//mark/v10/types/inventory] send by initiator,
[//mark/v10/types/inventoryresponse] send by target
);

 创建队列与服务

create queue [inventory client queue];
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:发送消息到消息队列中

use Inventory
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

select conversation_handle, cast(message_body as xml) as conversation_body from [Inventory queue]

这里只是查询了两列。

   其中conversation_body 就是 我们发出的信息了。

 setp 4: 从 inventory queue 中获取信息并更新数据

use inventory
go
begin transaction
declare @dialog_id uniqueidentifier
declare @message_body xml
declare @amount int;

    
最新技术文章:
 




特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3