Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 为什么我的查询抛出不正确的语法错误?_Sql Server_Sql Server 2008_Tsql - Fatal编程技术网

Sql server 为什么我的查询抛出不正确的语法错误?

Sql server 为什么我的查询抛出不正确的语法错误?,sql-server,sql-server-2008,tsql,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 注意:@TableName是Varchar(100),@OrgID是int调用CAST时缺少右括号

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

EXEC('Select Count(*) Total
      from '+@TableName+'
      where fk_Orgs_PropertyDetails_OrgID='+ 'Cast('+@OrgID+' as varchar')
为什么我会犯这样的错误

INCORRECT SYNTAX NEAR VARCHAR    

注意:
@TableName
Varchar(100)
@OrgID
int

调用
CAST
时缺少右括号。试试这个:

EXEC('Select Count(*) AS Total from ' + @TableName +
     ' where fk_Orgs_PropertyDetails_OrgID = Cast(' + @OrgID + ' as varchar)')
正如@Felix指出的,如果您的
fk\u Orgs\u PropertyDetails\u OrgID
列已经是
INT
,那么就没有必要将
@OrgID
强制转换为
VARCHAR
。因此,只需使用以下方法:

EXEC('Select Count(*) AS Total from ' + @TableName +
     ' where fk_Orgs_PropertyDetails_OrgID = ' + @OrgID)
在您的查询中,在最后的CAST中缺少“)”

如果@OrgID定义为varchar,而fk_Orgs_PropertyDetails_OrgID为int,则不需要使用强制转换。执行下列命令

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

谢谢

您缺少结束括号

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

正如其他人所回答的,您在
VARCHAR
之后忘记了

EXEC('Select Count(*) Total
      from '+@TableName+'
      where fk_Orgs_PropertyDetails_OrgID='+ 'Cast('+@OrgID+' as varchar)');
但是,我建议不要使用
EXEC
。相反,你应该使用。这还有一个额外的好处,即通过防止冲突来提供更多的安全性

以上假设
fk\u Orgs\u PropertyDetails\u OrgID
是一个
INT

进一步阅读动态SQL:

  • 埃尔兰·索马斯科格
  • 亚伦·伯特兰

什么是@OrgID值?这只是我传递的一个ID。它的数据类型是INTI hope,
fk\u Orgs\u PropertyDetails\u OrgID
int
?如果是这样,为什么要强制转换到varchar?我会添加一个建议,使用
sp\u executesql
来代替。如果
fk\u Orgs\u propertydeails\u OrgID
已经是
INT
了,那么为什么不直接使用
fk\u Orgs\u propertydeails\u OrgID=@OrgID
并用它来完成呢?@TimBiegeleisen你是什么意思?这正是我在
sp_executesql
解决方案中所做的。是的,但在这种情况下,对
EXEC
的原始调用也应该起作用,对吧?@TimBiegeleisen它仍然起不到作用,因为您正在将字符串(查询)与int(值
@OrgID
)连接起来。@TimBiegeleisen我可能错了。SQL Server可能会隐式转换该变量。此查询正在运行:
DECLARE@id INT=1;EXEC('SELECT*FROM(value(1)、(2))t(Id),其中Id='+@Id)