为什么我的查询会抛出错误的语法错误?

时间:2016-06-16 06:14:22

标签: sql-server sql-server-2008 tsql

我试图运行这个查询,因为它在运行时抛出错误,即

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

为什么会出现这个错误?

INCORRECT SYNTAX NEAR VARCHAR    

注意:@TableNameVarchar(100)@OrgIDint

4 个答案:

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

答案 1 :(得分:4)

正如其他人回答的那样,您在)之后忘了VARCHAR

EXEC('Select Count(*) Total
      from '+@TableName+'
      where fk_Orgs_PropertyDetails_OrgID='+ 'Cast('+@OrgID+' 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_OrgIDINT

进一步阅读动态SQL:

答案 2 :(得分:2)

在您的查询")"在最后一次CAST失踪。

如果定义了@OrgID,则varchar和fk_Orgs_PropertyDetails_OrgID为int,那么您不需要使用CAST。执行以下

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

如果列fk_Orgs_PropertyDetails_OrgID是varchar类型。执行以下

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

由于

答案 3 :(得分:0)

你缺少结束括号

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