2011-04-12 53 views
1

我试图将NetSqlAzMan的数据库移植到Azure。我遇到了一些存储过程的问题。将SQL Server 2008光标变量转换为SQL Azure

SET @member_cur = CURSOR STATIC FORWARD_ONLY FOR SELECT * FROM @RESULT 
OPEN @member_cur 

导致错误消息:

消息16948,级别16,状态4
程序 netsqlazman_GetApplicationGroupSidMembers, 线118
变量 '@member_cur' 是 不游标变量,但在游标变量为 的地方使用 。

存储过程脚本是通过以SQLAzure格式导出空的NetSQLAzMan数据库创建的。在SQL Azure中处理游标变量的任何提示?关于这方面的文档我看不出太多。

这是存储过程,如果有帮助。请原谅详细程度。该错误引用存储过程的底部。

CREATE PROCEDURE [dbo].[netsqlazman_GetApplicationGroupSidMembers] 
    @ISMEMBER [bit], 
    @GROUPOBJECTSID [varbinary](85), 
    @NETSQLAZMANMODE [bit], 
    @LDAPPATH [nvarchar](4000), 
    @member_cur [int] OUTPUT 
WITH EXECUTE AS CALLER 
AS 
DECLARE @RESULT TABLE (objectSid VARBINARY(85)) 
DECLARE @GROUPID INT 
DECLARE @GROUPTYPE TINYINT 
DECLARE @LDAPQUERY nvarchar(4000) 
DECLARE @sub_members_cur CURSOR 
DECLARE @OBJECTSID VARBINARY(85) 
SELECT @GROUPID = ApplicationGroupId, @GROUPTYPE = GroupType, @LDAPQUERY = LDapQuery FROM [netsqlazman_ApplicationGroupsTable] WHERE objectSid = @GROUPOBJECTSID 
IF @GROUPTYPE = 0 -- BASIC 
BEGIN 
    --memo: WhereDefined can be:0 - Store; 1 - Application; 2 - LDAP; 3 - Local; 4 - Database 
    -- Windows SIDs 
    INSERT INTO @RESULT (objectSid) 
    SELECT objectSid 
    FROM dbo.[netsqlazman_ApplicationGroupMembersTable] 
    WHERE 
    ApplicationGroupId = @GROUPID AND IsMember = @ISMEMBER AND 
    ((@NETSQLAZMANMODE = 0 AND (WhereDefined = 2 OR WhereDefined = 4)) OR (@NETSQLAZMANMODE = 1 AND WhereDefined BETWEEN 2 AND 4)) 
    -- Store Groups Members 
    DECLARE @MemberObjectSid VARBINARY(85) 
    DECLARE @MemberType bit 
    DECLARE @NotMemberType bit 
    DECLARE nested_Store_groups_cur CURSOR LOCAL FAST_FORWARD FOR 
     SELECT objectSid, IsMember FROM dbo.[netsqlazman_ApplicationGroupMembersTable] WHERE ApplicationGroupId = @GROUPID AND WhereDefined = 0 

    OPEN nested_Store_groups_cur 
    FETCH NEXT FROM nested_Store_groups_cur INTO @MemberObjectSid, @MemberType 
    WHILE @@FETCH_STATUS = 0 
    BEGIN 
      -- recursive call 
     IF @ISMEMBER = 1 
     BEGIN 
      IF @MemberType = 0 
       SET @NotMemberType = 0 
      ELSE 
       SET @NotMemberType = 1 
     END 
     ELSE 
     BEGIN 
      IF @MemberType = 0 
       SET @NotMemberType = 1 
      ELSE 
       SET @NotMemberType = 0 
     END 
     EXEC dbo.[netsqlazman_GetStoreGroupSidMembers] @NotMemberType, @MemberObjectSid, @NETSQLAZMANMODE, @LDAPPATH, @sub_members_cur OUTPUT 
     FETCH NEXT FROM @sub_members_cur INTO @OBJECTSID 
     WHILE @@FETCH_STATUS=0 
     BEGIN 
      INSERT INTO @RESULT VALUES (@OBJECTSID) 
      FETCH NEXT FROM @sub_members_cur INTO @OBJECTSID 
     END  
     CLOSE @sub_members_cur 
     DEALLOCATE @sub_members_cur   

     FETCH NEXT FROM nested_Store_groups_cur INTO @MemberObjectSid, @MemberType 
    END 
    CLOSE nested_Store_groups_cur 
    DEALLOCATE nested_Store_groups_cur 

    -- Application Groups Members 
    DECLARE nested_Application_groups_cur CURSOR LOCAL FAST_FORWARD FOR 
     SELECT objectSid, IsMember FROM dbo.[netsqlazman_ApplicationGroupMembersTable] WHERE ApplicationGroupId = @GROUPID AND WhereDefined = 1 

    OPEN nested_Application_groups_cur 
    FETCH NEXT FROM nested_Application_groups_cur INTO @MemberObjectSid, @MemberType 
    WHILE @@FETCH_STATUS = 0 
    BEGIN 
      -- recursive call 
     IF @ISMEMBER = 1 
     BEGIN 
      IF @MemberType = 0 
       SET @NotMemberType = 0 
      ELSE 
       SET @NotMemberType = 1 
     END 
     ELSE 
     BEGIN 
      IF @MemberType = 0 
       SET @NotMemberType = 1 
      ELSE 
       SET @NotMemberType = 0 
     END 
     EXEC dbo.[netsqlazman_GetApplicationGroupSidMembers] @NotMemberType, @MemberObjectSid, @NETSQLAZMANMODE, @LDAPPATH, @sub_members_cur OUTPUT 
     FETCH NEXT FROM @sub_members_cur INTO @OBJECTSID 
     WHILE @@FETCH_STATUS=0 
     BEGIN 
      INSERT INTO @RESULT VALUES (@OBJECTSID) 
      FETCH NEXT FROM @sub_members_cur INTO @OBJECTSID 
     END  
     CLOSE @sub_members_cur 
     DEALLOCATE @sub_members_cur 

     FETCH NEXT FROM nested_Application_groups_cur INTO @MemberObjectSid, @MemberType 
    END 
    CLOSE nested_Application_groups_cur 
    DEALLOCATE nested_Application_groups_cur 
    END 
ELSE IF @GROUPTYPE = 1 AND @ISMEMBER = 1 -- LDAP QUERY 
BEGIN 
    EXEC dbo.[netsqlazman_ExecuteLDAPQuery] @LDAPPATH, @LDAPQUERY, @sub_members_cur OUTPUT 
    FETCH NEXT FROM @sub_members_cur INTO @OBJECTSID 
    WHILE @@FETCH_STATUS=0 
    BEGIN 
     INSERT INTO @RESULT (objectSid) VALUES (@OBJECTSID) 
     FETCH NEXT FROM @sub_members_cur INTO @OBJECTSID 
    END 
    CLOSE @sub_members_cur 
    DEALLOCATE @sub_members_cur 
END 
SET @member_cur = CURSOR STATIC FORWARD_ONLY FOR SELECT * FROM @RESULT 
OPEN @member_cur 
GO 

回答

1

我不认为这个问题是与光标这么多,但更多与输出变量的声明。如果你看一下存储过程的开始,你有这样的:

@member_cur [int] OUTPUT 

@member_cur被定义为一个整数。然后你试图将它赋值为游标的值,这是正确的抱怨。我很惊讶的是,这是从非Azure SQL Server生成的。无论哪种方式,它看起来像SQL Azure不支持这一点,所以要么改变输出参数的类型,要么在另一个变量中打开你的游标,并将@member_cur指定为该值。