2016-06-16 2 views
0

Я пытаюсь запустить этот запрос, он выдает ошибку при запуске, т.е.Почему в моем запросе возникает некорректная синтаксическая ошибка?

EXEC('Select Count(*) Total 
     from '[email protected]+' 
     where fk_Orgs_PropertyDetails_OrgID='+ 'Cast('[email protected]+' as varchar') 

Почему эта ошибка я получаю?

INCORRECT SYNTAX NEAR VARCHAR  

Примечание: @TableName является Varchar(100) и @OrgID является int

+0

Будет @OrgID значение? –

+0

Его просто идентификатор, который я прохожу. Его тип данных INT – Cuckoo

+3

Надеюсь, что 'fk_Orgs_PropertyDetails_OrgID' является' int'? Если да, зачем бросать в варчар? –

ответ

8

У вас не хватает закрывающей скобки в вызове CAST. Попробуйте это:

EXEC('Select Count(*) AS Total from ' + @TableName + 
    ' where fk_Orgs_PropertyDetails_OrgID = Cast(' + @OrgID + ' as varchar)') 

Как @Felix отметил, если fk_Orgs_PropertyDetails_OrgID столбец уже INT, то нет никакой необходимости, чтобы бросить @OrgID в VARCHAR. Так что просто используйте следующее:

EXEC('Select Count(*) AS Total from ' + @TableName + 
    ' where fk_Orgs_PropertyDetails_OrgID = ' + @OrgID) 
+0

Я бы добавил предложение вместо 'sp_executesql'. –

2

В вашем запросе ")" отсутствует CAST.

Если @OrgID определен varchar, а fk_Orgs_PropertyDetails_OrgID - это int, тогда вам не нужно использовать CAST. Выполнить После

EXEC('Select Count(*) Total 
from '[email protected]+' 
where fk_Orgs_PropertyDetails_OrgID='[email protected]) 

Если столбец fk_Orgs_PropertyDetails_OrgID является тип VARCHAR. Выполнить После

EXEC('Select Count(*) Total 
from '[email protected]+' 
where fk_Orgs_PropertyDetails_OrgID='''[email protected]+'''') 

Благодарности

0

вам не хватает закрывающей скобки

EXEC('Select Count(*) Total from '+ @TableName + ' where fk_Orgs_PropertyDetails_OrgID=' + 'Cast('+ @OrgID + ' as varchar)') 
4

Как уже ответили, вы забыли ) после VARCHAR:

EXEC('Select Count(*) Total 
     from '[email protected]+' 
     where fk_Orgs_PropertyDetails_OrgID='+ 'Cast('[email protected]+' as varchar)'); 

Однако, я полагаю, не используя EXEC. Вместо этого вы должны использовать sp_executesql. Это дает дополнительное преимущество для обеспечения большей безопасности путем предотвращения SQL Injection.

DECLARE @TableName VARCHAR(100), 
     @OrgID  INT; 

DECLARE @sql NVARCHAR(MAX); 

SET @sql = 
'SELECT COUNT(*) Total 
FROM ' + QUOTENAME(@TableName) + ' 
WHERE fk_Orgs_PropertyDetails_OrgID = @OrgID'; 

EXEC sp_executesql 
    @sql, 
    N'@OrgID INT', 
    @OrgID 
; 

выше предполагает, что fk_Orgs_PropertyDetails_OrgID является INT.

Дальнейшее чтение динамического SQL:

+0

Если 'fk_Orgs_PropertyDetails_OrgID' уже является' INT', то почему бы не использовать 'fk_Orgs_PropertyDetails_OrgID = @ OrgId' напрямую и с ним сделать? –

+0

@TimBiegeleisen Что вы имеете в виду? Это именно то, что я сделал в своем решении 'sp_executesql'. –

+0

Да, но в этом случае также должен был работать оригинальный вызов 'EXEC', верно? –

Смежные вопросы