【问题标题】:Sub query in dynamic query SQL Server 2008动态查询SQL Server 2008中的子查询
【发布时间】:2011-11-03 09:46:52
【问题描述】:

如果将以下 select 语句放在动态查询中,则它不起作用。如果它移出动态查询,它工作正常

DECLARE @sid UNIQUEIDENTIFIER , @AttributeID UNIQUEIDENTIFIER
SET @sid = 'c0b5956b-47f2-4ad6-bb9a-67a5a249e4b7'
SET @AttributeID = 'F1A0D9D6-702E-4492-9EBC-63AD22E60E6A'

DECLARE @sql NVARCHAR(MAX) 
SET @sql = 'SELECT * FROM
        (select [CaseID],
            ( select 
                Attr.AttributeValue 
                from 
                [dbo].[CV_CaseAttributes] Attr
                Where Attr.CaseID = C.CaseID ANd Attr.AttributeID = @AttributeID
            ) AS CaseTitle
            ,[UserID]           
        FROM [dbo].[CaseMaster] C
        WHERE SpaceID =  @sid
        )
    AS Details'

    EXEC sp_executesql @sql
                  ,N'@sid UNIQUEIDENTIFIER,@AttributeID UNIQUEIDENTIFIER'
                  ,@sid=@sid,@AttributeID =@AttributeID

错误信息

消息 102,第 15 级,状态 1,第 2 行
',' 附近的语法不正确。
消息 156,第 15 级,状态 1,第 8 行
关键字“AS”附近的语法不正确。

为什么会这样?

【问题讨论】:

    标签: sql-server-2008 dynamic subquery


    【解决方案1】:

    改用这个(缺少一个SELECT,因此出现错误消息):

    'SELECT * FROM
            (SELECT [CaseID],
                ( select 
                    Attr.AttributeValue 
                    from 
                    [dbo].[CV_CaseAttributes] Attr
                    Where Attr.CaseID = C.CaseID ANd Attr.AttributeID = @AttributeID
                ) AS CaseTitle
                ,[UserID]           
            FROM [dbo].[CaseMaster] C
            WHERE SpaceID =  @sid
            )
        AS Details'
    

    编辑 - 根据 cmets:

    试试

    DECLARE @sidV UNIQUEIDENTIFIER , @AttributeIDV UNIQUEIDENTIFIER
    SET @sidV = 'c0b5956b-47f2-4ad6-bb9a-67a5a249e4b7'
    SET @AttributeIDV = 'F1A0D9D6-702E-4492-9EBC-63AD22E60E6A'
    
    DECLARE @sql NVARCHAR(MAX) 
    SET @sql = 'SELECT * FROM
            (select [CaseID],
                ( select 
                    Attr.AttributeValue 
                    from 
                    [dbo].[CV_CaseAttributes] Attr
                    Where Attr.CaseID = C.CaseID ANd Attr.AttributeID = @AttributeID
                ) AS CaseTitle
                ,[UserID]           
            FROM [dbo].[CaseMaster] C
            WHERE SpaceID =  @sid
            )
        AS Details'
    
        EXEC sp_executesql @sql
                      ,N'@sid UNIQUEIDENTIFIER,@AttributeID UNIQUEIDENTIFIER'
                      ,@sid=@sidV,@AttributeID =@AttributeIDV
    

    编辑 - 根据 cmets 一个“解释”:

    我不是 SQL Server 专家,所以请大家猜测一下:

    在我看来,解析器似乎将EXEC 后面的东西视为一个新范围。 因此,当按名称解析变量时,它首先在EXEC 的范围内进行检查,并且在找不到它正在寻找的内容时将搜索扩展到周围的范围。

    在原始语句的情况下,我们有 2 个变量在两个范围内(外部与内部EXEC)命名相同 - 这会导致在执行 EXEC 内部的代码期间解决这些问题时出现一些问题,因此不使用声明的来自EXEC 之外的变量。

    通过将名称更改为在两个范围内都是唯一的,解析器不再有这些问题...

    【讨论】:

    • 同样的错误 :(。如果我将它移出动态查询,查询工作正常。
    • @Yahia,我可以看到您已在外部 sp_executesql 范围内的变量名称中添加了“V”,但我不明白为什么这会有所不同,而且不清楚您还有什么已经解决了问题..
    • @TomHunter 我不是 SQL Server 专家,但用我的“解释”检查编辑(更多描述是什么导致我做出这些改变......也就是猜测)......跨度>
    猜你喜欢
    • 2011-07-08
    • 1970-01-01
    • 2011-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    • 2017-01-11
    • 2011-11-20
    相关资源
    最近更新 更多