IsNull ExecuteSql语法错误

时间:2011-12-16 15:26:44

标签: sql-server

我正在尝试弄清楚如何解决以下代码行的'incorrect syntax near 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的行会让我感到困惑。

此外,字母ab以及a.objectb.objectb.is_primary我还不明白。

我不认为任何人都可以告诉我这里发生的事情。

我甚至找不到@@指的是什么。

1 个答案:

答案 0 :(得分:2)

ExecuteSQL()接受两个参数,这两个参数都需要是字符串。您的第二个字符串没有开头' ...

试试这个,添加缺少的'? (注意:我没有检查你的查询的任何其他内容)

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
  ) 


就字母等而言,它们是标准的SQL语法......

短语sys.tables a表示您正在使用表sys.tables,但希望从现在起将其别名为a。这就是您之后看到a.name的原因。

同样适用于sys.indexes b,为表格b创建别名sys.indexes

我认为这种形式的不良做法。它与另一种语言中的变量ab相同。在我看来,拥有意味着的别名/变量名称要好得多。但这可以缩短代码。


对于@@部分,系统变量是在msdn博客here上解释的。

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


然后,ExecuteSQL()函数执行第二个参数中的代码,但只获取第一列的第一个值,并将其作为ExecuteSQL()的第一个参数中的类型返回。因为它总是返回一个值,它可能返回NULL。 ISNULL(ExecuteSQL(), 0)将任何NULL返回值替换为0。