Sql server IsNull ExecuteSql语法错误
我试图找出如何解决以下代码行的Sql server IsNull ExecuteSql语法错误,sql-server,Sql Server,我试图找出如何解决以下代码行的“ExecuteSql附近的语法错误”错误: IsNull (ExecuteSql ('Numeric' , SELECT 1 FROM sys.tables a INNER JOIN sys.indexes b ON a.object_id = b.object_id WHERE b.is_primary_key = 1 AND a.name = @@ObjectName AND a.schema_id = SCHEMA_ID (@@SchemaName)'),
“ExecuteSql附近的语法错误”
错误:
IsNull (ExecuteSql ('Numeric' , SELECT 1 FROM sys.tables a
INNER JOIN sys.indexes b ON a.object_id = b.object_id WHERE b.is_primary_key = 1 AND a.name = @@ObjectName AND a.schema_id = SCHEMA_ID (@@SchemaName)'), 0)
我不知所措
我想我理解,如果它找到null,它将返回0,但是以IsNull开头的行让我感到困惑
另外,字母a
和b
和a.object
或b.object
或b.object是我还不明白的主要字母
我想没有人能带我走过这里发生的一切
我甚至找不到@所指的内容 ExecuteSQL()接受两个参数,这两个参数都必须是字符串。您的第二个字符串没有开头“
尝试此操作,并将缺少的“
添加回?(注意:我没有检查关于您的查询的任何其他内容)
在字母等方面,它们是标准的SQL语法
短语sys.tables a
表示您正在使用表sys.tables
,但从现在起要将其别名为a
。这就是为什么稍后会看到a.name
这同样适用于sys.indexes b
,为表sys.indexes
创建别名b
我会考虑这种不良做法。这与在另一种语言中使用变量a
和b
是一样的。在我看来,最好使用有意义的别名/变量名。但这并不能缩短代码
对于@
部分,在msdn博客上解释了系统变量
然后,ExecuteSQL()函数执行第二个参数中的代码,但只获取第一列的第一个值,并将其作为ExecuteSQL()的第一个参数中的类型返回。由于它总是返回一个值,因此可能返回NULLISNULL(ExecuteSQL(),0)
将任何空返回值替换为0。这看起来没有意义,您是否阅读了ISNULL
上的MSDN。您需要ISNULL(Column,Value)
即ISNULL检查列或聚合是否为null或返回null,而不是完整的EXECUTESQL
表达式。@JonH-我对EXECUTESQL()函数的理解是,它返回指定查询返回的第一行的第一个字段中的值?ISNULL()应该可以工作吗?@Dems-这是非常正确的,我看了之后认为-我不太使用executesql
,这是可行的..meh+1:)。请投票人给出一个原因,以便OP可以解决它???
SELECT
IsNull(
ExecuteSql(
'Numeric',
'SELECT 1 FROM sys.tables a
INNER JOIN sys.indexes b ON a.object_id = b.object_id
WHERE b.is_primary_key = 1
AND a.name = @@ObjectName
AND a.schema_id = SCHEMA_ID (@@SchemaName)'
)
, 0
)
@@ObjectName - corresponds to the name field in sys.objects.
The variable will be replaced with the name of the current object.
@@SchemaName - corresponds to the name field in sys.schemas.
The variable will be replaced with the schema for the current
object if the current object belongs to a schema.