动态查询SQL Server 2008中的子查询

时间:2011-11-03 09:46:52

标签: sql-server-2008 dynamic subquery

如果将以下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

错误消息

  

Msg 102,Level 15,State 1,Line 2
  ','附近的语法不正确。
  Msg 156,Level 15,State 1,Line 8
  关键字“AS”附近的语法不正确。

为什么会这样?

1 个答案:

答案 0 :(得分: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'

编辑 - 根据评论:

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

编辑 - 根据评论“解释”:

我不是SQL Server专家,所以请将以下内容作为猜测:

对我而言,似乎解析器将EXEC后面的内容视为新范围。 因此,当按名称解析变量时,它首先在EXEC的范围内进行检查,并且在找不到它所寻找的内容时将其扩展到周围范围。

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

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