首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Server 2008游标变量转换为SQL

将Server 2008游标变量转换为SQL
EN

Stack Overflow用户
提问于 2011-04-12 17:03:39
回答 1查看 2.2K关注 0票数 1

我正在尝试将NetSqlAzMan的数据库移植到Azure。我遇到了一些存储过程的问题。

代码语言:javascript
复制
SET @member_cur = CURSOR STATIC FORWARD_ONLY FOR SELECT * FROM @RESULT
OPEN @member_cur

错误信息的结果:

Msg 16948,16级,状态4

过程netsqlazman_GetApplicationGroupSidMembers,第118号线

变量'@member_cur‘不是游标变量,但它使用在需要游标变量的地方。

存储过程脚本是通过导出SQLAzure格式的空SQLAzure数据库创建的。在SQL中有处理游标变量的技巧吗?我看不出这方面的文件有多少。

这是存储过程,如果这有帮助的话。请原谅我说的话。错误引用存储过程的底部。

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-04-12 20:40:35

我不认为这个问题与游标有关,但更多的是输出变量的声明。如果您查看存储过程的开始,您可以看到以下内容:

代码语言:javascript
复制
@member_cur [int] OUTPUT

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5638953

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档