我編寫了一個存儲過程在Crystal Report中使用。它工作得很好。我還想在另外一個存儲過程中使用這個存儲過程產(chǎn)生的結(jié)果。我該怎么做?
專家回答:
只要存儲過程只產(chǎn)生了一個單個的結(jié)果,要在另外一個存儲過程中使用這個存儲過程產(chǎn)生的輸出,這個技術是非常直接的。這個技術就是使用一個臨時表來裝載存儲過程的巨額iguo,然后通過INSERT EXEC語句來執(zhí)行這個過程并保存結(jié)果。一旦結(jié)果保留在臨時表中了,他們就可以像使用其它表數(shù)據(jù)一樣來使用它了。
這里是我們可能會復用的一個過程例子:
CREATE PROC usp_Demo_AllAuthors as select * from pubs..authors
GO
現(xiàn)在有一個存儲過程使用usp_Demo_AllAuthors的結(jié)果:
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,
address varchar (40) NULL ,
city varchar (20) NULL ,
state char (2) NULL ,
zip char (5) 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 2005中的存儲過程并發(fā)問題
問題提交于2006年7月26日
我在SQL Server2005中遇到了并發(fā)問題。我持有車票的公共汽車上有一些空閑的座位。我在插入銷售的查票之前,需要查看是否還有空閑的座位。我的存儲過程做的事情如下所示:
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 <> 0 INSERT INTO tickets VALUES(…) — some other statements END TRANSACTION
問題就是兩個過程可以同時讀取空閑票數(shù),并且都可以預約一張票,即使是那里已經(jīng)沒有空余的了。我需要一種方法來防止一個過程在另一個過程運行add_ticket程序,但是還沒有插入一張新票的時候讀取空票的數(shù)量。在這種情況下,SET TRANSACTION ISOLATION LEVEL不管用了,我說的對嗎?
專家回答:
你是正確的;更高的隔離級別也不會保證多個讀者去同時去讀取同一個數(shù)據(jù)行。然而,還有幾種方法你可以完成這項工作。例如,你可以給每個座位分配一個惟一的標識符(意思是,惟一鍵——不一定是GUID),并且創(chuàng)建一個描述哪些座位已經(jīng)被預訂了的表。在表上放一個 UNIQUE約束,你就可以確保同一個座位不會被插入兩次了。
就是說,我認為一個更有趣的方法就是使用SQL Service Broker。你可以為每個公交建立一個會話,并且將這個會話的句柄存放在一個表中,讀者在執(zhí)行RECEIVE之前可以參考這個表。通過這種方式,讀者就可以正確地過濾。公共汽車上的每個座位都插一個消息到隊列中。讀者就可以簡單地RECEIVE到所需的消息(在這個過程中,預定公共汽車上的座位)。 Service Broker會確保沒有消息會被接受兩次,也就是說你不會再遇到并發(fā)問題了。
專家回答:
只要存儲過程只產(chǎn)生了一個單個的結(jié)果,要在另外一個存儲過程中使用這個存儲過程產(chǎn)生的輸出,這個技術是非常直接的。這個技術就是使用一個臨時表來裝載存儲過程的巨額iguo,然后通過INSERT EXEC語句來執(zhí)行這個過程并保存結(jié)果。一旦結(jié)果保留在臨時表中了,他們就可以像使用其它表數(shù)據(jù)一樣來使用它了。
這里是我們可能會復用的一個過程例子:
CREATE PROC usp_Demo_AllAuthors as select * from pubs..authors
GO
現(xiàn)在有一個存儲過程使用usp_Demo_AllAuthors的結(jié)果:
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,
address varchar (40) NULL ,
city varchar (20) NULL ,
state char (2) NULL ,
zip char (5) 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 2005中的存儲過程并發(fā)問題
問題提交于2006年7月26日
我在SQL Server2005中遇到了并發(fā)問題。我持有車票的公共汽車上有一些空閑的座位。我在插入銷售的查票之前,需要查看是否還有空閑的座位。我的存儲過程做的事情如下所示:
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 <> 0 INSERT INTO tickets VALUES(…) — some other statements END TRANSACTION
問題就是兩個過程可以同時讀取空閑票數(shù),并且都可以預約一張票,即使是那里已經(jīng)沒有空余的了。我需要一種方法來防止一個過程在另一個過程運行add_ticket程序,但是還沒有插入一張新票的時候讀取空票的數(shù)量。在這種情況下,SET TRANSACTION ISOLATION LEVEL不管用了,我說的對嗎?
專家回答:
你是正確的;更高的隔離級別也不會保證多個讀者去同時去讀取同一個數(shù)據(jù)行。然而,還有幾種方法你可以完成這項工作。例如,你可以給每個座位分配一個惟一的標識符(意思是,惟一鍵——不一定是GUID),并且創(chuàng)建一個描述哪些座位已經(jīng)被預訂了的表。在表上放一個 UNIQUE約束,你就可以確保同一個座位不會被插入兩次了。
就是說,我認為一個更有趣的方法就是使用SQL Service Broker。你可以為每個公交建立一個會話,并且將這個會話的句柄存放在一個表中,讀者在執(zhí)行RECEIVE之前可以參考這個表。通過這種方式,讀者就可以正確地過濾。公共汽車上的每個座位都插一個消息到隊列中。讀者就可以簡單地RECEIVE到所需的消息(在這個過程中,預定公共汽車上的座位)。 Service Broker會確保沒有消息會被接受兩次,也就是說你不會再遇到并發(fā)問題了。