SQLServer開發(fā)問題前十名[3]

字號:

我編寫了一個存儲過程在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ā)問題了。