2011-12-16 91 views
0

我試圖找出如何解決'incorrect syntax near ExecuteSql'錯誤以下行的代碼:ISNULL的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) 

,我不知所措。

我想我明白,它發現一個空它將返回0,但開始與IsNull行混淆了我。

此外,字母aba.objectb.objectb.is_primary我還不知道。

我不認爲任何人都可以引導我瞭解這裏發生的事情。

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

+0

這看起來沒有道理,您是否閱讀過MSN上的`IsNull`。您需要`ISNULL(Column,Value)`IsNull檢查列或聚合是否爲null或返回null,而不是整個`EXECUTESQL`表達式。 – JonH 2011-12-16 15:30:02

回答

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,爲表sys.indexes創建別名b

我會認爲這種形式的壞習慣。這與其他語言中的變量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)用0代替任何NULL返回值。