0

我們正在開始從SQL Server 2000升級到SQL Server 2008,然後是SQL Server 2012(我們不能直接從2000到2012)。SELECT在存儲過程中使用時返回不同的結果

一個SQL Server 2000中的存儲過程的@ErrorMsg值設置爲從sys.objects圖,其中name是一個給定值的名稱列。爲了達到這些目的,我們假設我正在尋找sys.objects視圖中存在的名稱zz_BICWS_PersonInfo_Search_1000000000000000000

程序工作在SQL Server 2000中,如果我在SQL Server 2012中運行下面的代碼將返回正確的名稱,但在SQL Server中不確實在存儲過程中2012年

declare @ErrorMsg varchar(1000) 

set @ErrorMsg = 'xxxxxxx' 

select @ErrorMsg = name 
    from bic.dbo.sysobjects 
    Where name = 'zz_BICWS_PersonInfo_Search_10000000000000000000' 

print 'test ' + @ErrorMsg 

這些相同的線存在於存儲過程中,除了打印行@ErrorMsg被輸出到調用該過程的應用程序。但它會使用應用程序中的消息框返回初始值xxxxxx以顯示返回的值。

但是,如果我改變where子句

Where name Like ‘zz_BICWS_PersonInfo_Search_%’ 

(沒有符合這一點,約40行),那麼我會找到的第一個行的名稱。

+0

那麼你是否已經在SQL 2012中完全實現了它,並且你沒有得到你期望的結果?基於句子'存儲過程中存在相同的行,除了打印行'只是讓我感到驚訝。 – 2012-08-07 20:09:38

+0

您是否認爲在調用存儲過程時該對象不存在? – 2012-08-07 21:25:17

回答

0

我在那裏發現問題有點麻煩,但我認爲問題在於你試圖將40行插入一個變量。

嘗試丟棄@ErrorMsg變量,只是運行以下命令:

select name 
from bic.dbo.sysobjects 
Where name = 'zz_BICWS_PersonInfo_Search_10000000000000000000' 
1

感謝另一個論壇上,我收到了答案。我在這裏發佈可能會遇到同樣問題的其他人。

SQL 2000和更高版本之間有一個重要的區別。在SQL 2000中,所有人都可以看到所有的元數據,並且沒有辦法改變它。

在SQL 2005和更高版本中,如果您有權限,則只能查看元數據。當你的SELECT語句由普通用戶從你的應用程序執行時,你的SELECT語句沒有行。但是,當你以sa身份運行SSMS中的SELECT時,或者至少使用db_owner權限運行時,一切正常。

如果您依賴可見的元數據,則需要將權限VIEW DEFINITION授予適當的用戶。

GRANT查看定義appusers

將授予在數據庫中的作用appusers所有對象視圖定義。本聲明授予在dbo架構中的所有對象的權限:

GRANT VIEW DEFINITION有關模式:: DBO TO appusers

許可視圖定義是隱含的對象上,如果你有選擇或執行權限。