SQLServer开发问题前十名[3]

SQLServer开发问题前十名[3],第1张

SQLServer开发问题前十名[3],第2张

我写了一个存储过程用于Crystal Report。效果很好。我还想在另一个存储过程中使用这个存储过程的结果。我该怎么办?

专家回答:

只要一个存储过程只产生一个结果,在另一个存储过程中使用这个存储过程的输出就非常简单。这种技术是用一个临时表加载存储过程的巨大iguo,然后通过INSERT EXEC语句执行过程并保存结果。一旦结果保存在临时表中,他们就可以像使用其他表数据一样使用它。

下面是一个我们可能会重用的流程示例:
Create Proc USP _ Demo _ all authors as select * from pubs..authors
Go
现在有一个存储过程使用USP _ demo _ all authors的结果:
CREATE proc USP _ Demo _ SPUser as CREATE TABLE # Authors(
au _ id varchar(11)NOT NULL PRIMARY KEY CLUSTERED,
au _ lname varchar(40)NOT NULL,
au _ fname varchar(20)NOT NULL,
phone char (12) NOT NULL,

约定位不为空
)–执行usp_Demo_AllAuthors存储
–导致#Authors
insert into # Authors
执行USP _ Demo _ all Authors–这里我们使用# Authors表。 此示例仅
–仅从temp表中选择,但是您可以做更多的事情
–例如在表上使用光标或连接
–其他数据。
SELECT au _ fName+' '+au _ lname as[name]
,address+','+city+','+state+' '+zip[Addr]
from # Authors drop TABLE # Authors
GO

SQL Server 2005中存储过程的并发性

问题提交于2006年7月26日。

我在SQL Server2005中遇到了并发问题。凭我的票,车上还有几个空空位。在我插入销售的机票支票之前,我需要检查是否有任何座位可用空。我的存储过程的作用如下:

CREATE PROCEDURE add_ticket —参数声明free _ seats int BEGIN TRANSACTION SELECT free _ seats = COUNT(*)FROM tickets WHERE
seat _ is _ not _ taken IF free _ seats 0 INSERT INTO tickets VALUES(…)—其他一些语句结束事务

问题是两个进程可以同时读取空空闲票,都可以预留一张票,即使没有空剩余。我需要一种方法来防止一个进程在另一个进程中运行add_ticket程序,但是在没有插入新票的情况下读取空票的数量。在这种情况下,设置事务隔离级别不起作用。我说的对吗?

专家回答:

你是对的;较高的隔离级别不能保证多个读取器会同时读取同一数据行。然而,有几种方法可以完成这项工作。例如,您可以为每个座位分配一个惟一的标识符(即惟一的键,不一定是GUID ),并创建一个表来描述哪些座位已经被预订。在表上放一个惟一的约束,就可以保证同一个座位不会被插入两次。

也就是说,我觉得更有趣的方式是使用SQL Service Broker。您可以为每条总线建立一个会话,并将该会话的句柄存储在一个表中,读者可以在接收之前参考该表。这样读者才能正确筛选。公共汽车上的每个座位都在队列中插入一条消息。读者可以简单地接收所需的信息(在此过程中,在公共汽车上预订座位)。Service Broker将确保任何消息都不会被接受两次,这意味着您不会再遇到并发问题。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » SQLServer开发问题前十名[3]

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情