我正在尝试弄清楚如何解决以下代码行的'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的行会让我感到困惑。
此外,字母a
和b
以及a.object
或b.object
或b.is_primary
我还不明白。
我不认为任何人都可以告诉我这里发生的事情。
我甚至找不到@@指的是什么。
答案 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
。
我认为这种形式的不良做法。它与另一种语言中的变量a
和b
相同。在我看来,拥有意味着的别名/变量名称要好得多。但这可以缩短代码。
对于@@
部分,系统变量是在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。