Подзапрос в динамическом запросе SQL Server 2008 - PullRequest
0 голосов
/ 03 ноября 2011

Следующий оператор выбора не работает, если он помещен в динамический запрос.Он работает нормально, если он вышел из динамического запроса

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".

Почему это так?

1 Ответ

1 голос
/ 03 ноября 2011

используйте это вместо этого (один 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'

РЕДАКТИРОВАТЬ - согласно комментариям:

try

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.

При изменении имен на уникальные для обеих областей анализатор больше не сталкивался с этими проблемами ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...