SELECT在存储过程中使用时返回不同的结果

时间:2012-08-07 20:03:20

标签: sql-server-2008 stored-procedures sql-server-2000 sql-server-2012

我们正在开始从SQL Server 2000升级到SQL Server 2008然后再升级到SQL Server 2012(我们不能直接从2000年到2012年)。

SQL Server 2000中的一个存储过程将@ErrorMsg的值设置为sys.objects视图中名称列,其中name是给定值。出于这些目的,我们假设我正在寻找zz_BICWS_PersonInfo_Search_1000000000000000000视图中存在的名称sys.objects

该过程适用于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输出到调用该过程的app。但它使用应用程序中的消息框返回初始值xxxxxx以显示返回的值。

但是如果我将where子句改为

Where name Like ‘zz_BICWS_PersonInfo_Search_%’  

(大约有40行与此匹配)然后我将获得找到的第一行的名称。

2 个答案:

答案 0 :(得分:1)

感谢另一个论坛,我收到了答案。我在这里发帖给其他可能遇到同样问题的人。

SQL 2000和更高版本之间存在重要差异。在SQL 2000中,每个人都可以看到所有元数据,并且无法更改它。

在SQL 2005及更高版本中,如果您有权限,则只能看到元数据。当SELECT语句由应用程序中的普通用户执行时,SELECT语句不会出现任何行。但是当您在SSMS中连接的SS中运行SELECT时,或者至少使用db_owner权限时,一切正常。

如果您依赖可见的元数据,则需要将权限VIEW DEFINITION授予相应的用户。

授予应用程序的定义

会将数据库中所有对象的VIEW DEFINITION授予角色appusers。此语句授予dbo架构中所有对象的权限:

授予SCHEMA :: dbo对应用程序的定义

如果您拥有SELECT或EXECUTE权限,则会在对象上隐含权限VIEW DEFINITION。

答案 1 :(得分:0)

我在那里找到问题时遇到了一些麻烦,但我认为问题在于你试图将40行堵塞到一个变量中。

尝试删除@ErrorMsg变量,然后运行它:

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