我编写了一个存储过程在Crystal Report中使用它工作得很好我还想在另外一个存储过程中使用这个存储过程产生的结果我该怎么做?
专家回答:
只要存储过程只产生了一个单个的结果要在另外一个存储过程中使用这个存储过程产生的输出这个技术是非常直接的这个技术就是使用一个临时表来装载存储过程的巨额iguo然后通过INSERT EXEC语句来执行这个过程并保存结果一旦结果保留在临时表中了他们就可以像使用其它表数据一样来使用它了
这里是我们可能会复用的一个过程例子:
CREATE PROC usp_Demo_AllAuthors as select * from pubsauthors
GO
现在有一个存储过程使用usp_Demo_AllAuthors的结果:
CREATE proc usp_Demo_SPUser as CREATE TABLE #Authors (
au_id varchar() NOT NULL PRIMARY KEY CLUSTERED
au_lname varchar () NOT NULL
au_fname varchar () NOT NULL
phone char () NOT NULL
address varchar () NULL
city varchar () NULL
state char () NULL
zip char () NULL
contract bit NOT NULL
)– Execute usp_Demo_AllAuthors storing the
– results in #Authors
insert into #Authors
exec usp_Demo_AllAuthors– Here we use the #Authors table This example only
– only selects from the temp table but you could do much
– more such as use a cursor on the table or join with
– other data
SELECT au_fName + + au_lname as [name]
address+ +city+ +state+ +zip [Addr]
from #AuthorsDROP TABLE #Authors
GO
SQL Server 中的存储过程并发问题
问题提交于年月日
我在SQL Server中遇到了并发问题我持有车票的公共汽车上有一些空闲的座位我在插入销售的查票之前需要查看是否还有空闲的座位我的存储过程做的事情如下所示:
CREATE PROCEDURE add_ticket — parameters DECLARE free_seats int BEGIN TRANSACTION SELECT free_seats = COUNT(*) FROM tickets WHERE
seat_is_not_taken IF free_seats <> INSERT INTO tickets VALUES(…) — some other statements END TRANSACTION
问题就是两个过程可以同时读取空闲票数并且都可以预约一张票即使是那里已经没有空余的了我需要一种方法来防止一个过程在另一个过程运行add_ticket程序但是还没有插入一张新票的时候读取空票的数量在这种情况下SET TRANSACTION ISOLATION LEVEL不管用了我说的对吗?
专家回答:
你是正确的;更高的隔离级别也不会保证多个读者去同时去读取同一个数据行然而还有几种方法你可以完成这项工作例如你可以给每个座位分配一个惟一的标识符(意思是惟一键——不一定是GUID)并且创建一个描述哪些座位已经被预订了的表在表上放一个 UNIQUE约束你就可以确保同一个座位不会被插入两次了
就是说我认为一个更有趣的方法就是使用SQL Service Broker你可以为每个公交建立一个会话并且将这个会话的句柄存放在一个表中读者在执行RECEIVE之前可以参考这个表通过这种方式读者就可以正确地过滤公共汽车上的每个座位都插一个消息到队列中读者就可以简单地RECEIVE到所需的消息(在这个过程中预定公共汽车上的座位) Service Broker会确保没有消息会被接受两次也就是说你不会再遇到并发问题了
[] [] [] [] []