调用存储过程,返回值,经典ASP我错过了什么?

时间:2013-12-12 16:30:00

标签: sql-server stored-procedures asp-classic

我的存储过程:

CREATE PROCEDURE [dbo].[uspUserIsInGroup]
@username varchar(30),
@groupname varchar(30),
@ReturnCount int OUTPUT
    AS
    BEGIN
  SET NOCOUNT ON;

      SELECT @ReturnCount = count(*)
      FROM sys.database_role_members AS m
      INNER JOIN sys.database_principals AS dp
         ON m.member_principal_id = dp.principal_id
      INNER JOIN sys.server_principals AS l
         ON dp.[sid] = l.[sid]
      INNER JOIN sys.database_principals AS r
         ON m.role_principal_id = r.principal_id
      WHERE 1=1
      AND l.name = @username
      AND r.name = @groupname
  END

我的asp代码:

 Set cn = CreateObject("ADODB.Connection")
 Set cmd = CreateObject("ADODB.Command")
 cn.Open db
 Set cmd.ActiveConnection = cn
 cmd.CommandText = "uspUserIsInGroup"
 cmd.CommandType = 4 '4=adCmdStoredProc

 cmd.Parameters.Append cmd.CreateParameter("@username", 203, 1, 100, "peds\pss_admin")
 cmd.Parameters.Append cmd.CreateParameter("@groupname", 203, 1, 100, "rolePSS_admin")
 cmd.Parameters.Append cmd.CreateParameter("@ReturnCount", 200, 2, 255)
 cmd.Execute
 response.write "value returned is: " & cmd.Parameters(2).Value & "<br />"

我试过了:

 response.write "value returned is: " & cmd.Parameters(2).Value & "<br />"
 response.write "value returned is: " & cmd.Parameters(2) & "<br />"
 response.write "value returned is: " & cmd.Parameters("@ReturnCount").Value & "<br />"
 response.write "value returned is: " & cmd.Parameters("@ReturnCount") & "<br />"

我尝试过'@'而没有。我已经检查了权限。在通话情况下,我得到'0',但值应为1.

在SQL上运行跟踪,这就是正在运行的内容:

declare @p3 int
set @p3=0
exec uspUserIsInGroup N'peds\pss_admin',N'rolePSS_admin',@p3 output
select @p3

结果为1。

enter image description here

我做错了什么,我错过了什么?当我从Trace运行代码时,结果有“(No column name)”这个事实是否有任何关系?

谢谢!

2 个答案:

答案 0 :(得分:1)

如评论中所述,您的查询结果可能会根据登录用户的权限进行更改。

如果您不想直接授予asp帐户所需的权限,则可以使用procedure signing

sys.database_principals

  

任何用户都可以看到自己的用户名,系统用户和固定用户   数据库角色。要查看其他用户,需要ALTER ANY USER或a   对用户的许可。要查看用户定义的角色,需要ALTER ANY   角色,或角色的成员。

sys.database_role_members

  

任何用户都可以查看自己的角色成员资格。查看其他角色   成员资格需要db_securityadmin固定数据库的成员资格   角色或查看数据库的定义。

sys.server_principals

  

任何登录都可以看到自己的登录名,系统登录名和   固定服务器角色。要查看其他登录,需要ALTER ANY LOGIN或   登录权限。要查看用户定义的服务器角色,请参阅   更改任何服务器角色,或角色的成员资格。

答案 1 :(得分:0)

cmd.Parameters.Append cmd.CreateParameter(&#34; @ username&#34;,203,1,100,&#34; peds \ pss_admin&#34;) cmd.Parameters.Append cmd.CreateParameter(&#34; @ groupname&#34;,203,1,100,&#34; rolePSS_admin&#34;) cmd.Parameters.Append cmd.CreateParameter(&#34; @ ReturnCount&#34;,200,2,255)

- 应该是 -

cmd.Parameters.Append cmd.CreateParameter("@username", adVarChar, adParamInput, 30, "peds\pss_admin")
cmd.Parameters.Append cmd.CreateParameter("@groupname", adVarChar, adParamInput, 30, "rolePSS_admin")
cmd.Parameters.Append cmd.CreateParameter("@ReturnCount",adInteger,adParamOutput)

其中adInteger = 3,adParamOutput = 2,adVarChar = 200

所以使用硬编码数字的语句输出参数应为:

cmd.Parameters.Append cmd.CreateParameter("@ReturnCount", 3, 2)