2012-07-23 93 views
2

我是新來創建存儲過程,我看到下面這個SQL在現有的存儲過程:在SQL存儲過程中,「AND(N'P',N'PC')」的用法是什麼?

IF EXISTS (SELECT * FROM table WHERE object_id = OBJECT_ID(N'stored_proc_name') AND type in (N'P', N'PC')) 
DROP PROCEDURE 'stored_proc_name' Go 

一些調查我做了後,我發現,我們使用N代表任何Unicode字符可能存在。但是,我不確定爲什麼我們使用「輸入(N'P',N'PC')」?

任何人都可以請解釋這個構造?

另外,只要確認我在使用N的想法中是否正確?

回答

4

是的,N表示字符串是unicode。

還有什麼你已經是in運營商,即n in (n, ...)其中第一個操作數是場type,並在括號中的數值是兩個Unicode字符串。

所以它的意思與and (type = N'P' or type = N'PC')相同。

+0

含義相同的信息,但他們「在」工作非常不同的,工作起來更有效 – BlackTigerX 2013-08-01 19:39:19

0

「N」是一種表達恆定Unicode字符串(每字符2字節/字符而不是1 /字節)的Microsoft方式。一些內置函數和存儲過程需要它。

「P」和「PC」指定對象的類型。

+0

Unicode是不是總是(或者說經常)2個字節... – egrunin 2012-07-23 15:42:52

+0

的http:// MSDN .microsoft.com/en-us/library/aa933104(v = sql.80).aspx – 2012-07-23 15:48:31

+0

「Unicode數據類型需要兩倍於非Unicode數據類型的存儲空間」 - 其中包含MBCS。結果,Unicode每個字形通常是4個字節。 – egrunin 2012-07-23 15:56:38

5

要添加到其他答案:

你正在檢查的對象[DBO]是否[SP_NAME]存在,並且是一個存儲過程(P)或組裝存儲過程(PC)。

下面是我們使用的一個例子:

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[sp_NAME]') AND type in (N'P', N'PC')) 
DROP PROCEDURE [dbo].[sp_NAME] 
GO 

下面是一個類似question的答案。

有關的assembly stored procedure.

相關問題