2011-11-03 157 views
0

如果将下面的select语句置于动态查询中,它将无法正常工作。它工作正常,如果它搬走了动态查询动态查询中的子查询SQL Server 2008

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' 
        ,@[email protected],@AttributeID [email protected] 

错误消息

消息102,15级,状态1,行2
附近有语法错误 ''。
Msg 156,Level 15,State 1,Line 8
关键字'AS'附近的语法不正确。

这是为什么?

回答

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' 
        ,@[email protected],@AttributeID [email protected] 

编辑 - 为每个评论的“解释“:

我不是SQL Server专家,所以请采取以下行动ng作为猜测:

对我来说,解析器看起来似乎把EXEC作为一个新的范围。 因此,当通过名称解析变量时,它首先在EXEC的范围内进行检查,并且在找不到要查找的内容时将其扩展到周围的范围。

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

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

+0

我错过了。但是,它仍然给出错误:( – Rauf

+0

@Rauf仍然是相同的错误或不同的一个? – Yahia

+0

同样的错误:(。查询工作正常,如果我把它移出动态查询。 – Rauf